您好,欢迎来到达州工业云! 平台首页 企业驾驶舱 帮助中心 企业登录 企业注册

HI,欢迎使用达州工业云平台!

账号必须大于2位

创新资源平台
服务平台首页>专利库>专利详情

用于处理加载/存储分离指令的方法和系统

  • 申请号:CN201080063865.2 申请公布号: CN102754069B
  • 申请日: 2010-11-08 申请公布日: 2014-12-24
  • 申请(专利权)人: 专利代理机构: 北京市金杜律师事务所
  • 分类号:G06F9/312;G06F9/38;G06F9/30

专利介绍

一种加载/存储分离指令,当其被CPU执行时访问来自两个分离存储器位置的操作数,并且设置条件代码指示符以指示两个操作数是否看似借助于块并发互锁在没有来自其他CPU对该操作数的干扰存储的情况下被原子地访问。在指令形式的加载对分离中,访问是加载,并且分离数据被存储在通用寄存器中。
1.一种用于在多处理器系统的处理器中执行加载/存储分离指令的计算机实现的方法,所述方法包括:获取加载/存储分离指令以用于执行,所述加载/存储分离指令包括操作码,所述执行包括:基于获取的操作码执行加载/存储分离指令指定的操作,所述操作包括访问存储器中的两个分离操作数;响应于确定来自所述多处理器系统的另一处理器的干扰存储事件是否已在所述访问存储器中的所述两个分离操作数的期间修改了所述两个分离操作数之一,在程序可访问的位置设置第一指示符值,其中,所述第一指示符值包括第一条件代码值或第二条件代码值中的任何一个,所述第一条件代码值指示来自所述多处理器系统的另一处理器的干扰存储事件可能已在所述访问存储器中的所述两个分离操作数的期间修改了所述两个分离操作数之一,所述第二条件代码值指示没有干扰存储事件修改了在所述访问存储器中的所述两个分离操作数的期间修改了所述两个分离操作数之一。
2.根据权利要求1所述的方法,其中所述加载/存储分离指令是加载对分离指令,其中所述访问所述存储器中的所述两个分离操作数包括从存储器取回第一操作数和第二操作数,所述方法还包括:将取回的所述第一操作数和取回的所述第二操作数存储在所述加载对分离指令指定的一个或多个寄存器中。
3.根据权利要求2所述的方法,其中所述一个或多个寄存器是包括第一寄存器和第二寄存器的寄存器对,其中所述加载对分离指令包括标识第一通用寄存器的第一通用寄存器字段、标识第二通用寄存器的第二通用寄存器字段以及标识所述第一寄存器和所述第二寄存器的第三通用寄存器字段,所述方法还包括:从由所述第一通用寄存器字段标识的所述第一通用寄存器获取第一地址;以及将获取的所述第一地址用于取回所述存储器中的所述第一操作数;以及从由所述第二通用寄存器字段标识的所述第二通用寄存器获取所述存储器中的所述第二操作数的第二地址;以及将获取的所述第二地址用于取回所述存储器中的所述第二操作数;其中所述加载/存储分离指令指定的操作是加载对分离操作,其中所述第一寄存器处于所述第三通用寄存器字段(R3)指定的偶数地址,并且所述第二寄存器处于递增的第三通用寄存器字段(R3+1)指定的奇数寄存器地址,其中所述第一操作数存储在所述第一寄存器中并且所述第二操作数存储在所述第二寄存器中。
4.根据权利要求3所述的方法,其中所述获取的所述加载对分离指令还包括第一位移字段和第二位移字段,所述方法还包括:将所述第一位移字段与获取的所述第一地址算术相加,以创建第一存储器地址用于所述取回所述存储器中的所述第一操作数;以及将所述第二位移字段与获取的所述第二地址算术相加,以创建第二存储器地址用于所述取回所述存储器中的所述第二操作数。
5.根据权利要求1所述的方法,还包括:从所述多处理系统的多个处理器接收存储事件;以及将接收的所述存储操作的数据存储在所述存储器中。
6.根据权利要求4所述的方法,其中针对计算机架构而定义的所述加载对分离指令由备选计算机架构的中央处理单元取回和执行,所述方法还包括:解释所述加载对分离指令以标识用于对所述加载对分离指令的操作进行仿真的预定软件例程;以及执行所述加载对分离指令包括执行所述预定软件例程以执行所述方法的步骤以用于执行机器指令。
7.一种用于在多处理器系统的处理器中执行加载/存储分离指令的计算机系统,包括:存储器;与所述存储器通信的处理单元,所述处理单元包括用于从存储器取回指令的取指单元以及用于执行取回的指令的一个或多个执行单元;其中所述计算机系统被配置为:获取加载/存储分离指令以用于执行,所述加载/存储分离指令包括操作码,所述执行包括:基于获取的操作码执行加载/存储分离指令指定的操作,所述操作包括访问存储器中的两个分离操作数;响应于确定来自所述多处理器系统的另一处理器的干扰存储事件是否已在所述访问存储器中的所述两个分离操作数的期间修改了所述两个分离操作数之一,在程序可访问的位置设置第一指示符值,其中,所述第一指示符值包括第一条件代码值或第二条件代码值中的任何一个,所述第一条件代码值指示来自所述多处理器系统的另一处理器的干扰存储事件可能已在所述访问存储器中的所述两个分离操作数的期间修改了所述两个分离操作数之一,所述第二条件代码值指示没有干扰存储事件修改了在所述访问存储器中的所述两个分离操作数的期间修改了所述两个分离操作数之一。
8.根据权利要求7所述的计算机系统,其中所述加载/存储分离指令是加载对分离指令,其中所述访问所述存储器中的所述两个分离操作数包括从存储器取回第一操作数和第二操作数,所述执行还包括:将取回的所述第一操作数和取回的所述第二操作数存储在所述加载对分离指令指定的一个或多个寄存器中。
9.根据权利要求8所述的计算机系统,其中所述一个或多个寄存器是包括第一寄存器和第二寄存器的寄存器对,其中所述加载对分离指令包括标识第一通用寄存器的第一通用寄存器字段、标识第二通用寄存器的第二通用寄存器字段以及标识所述第一寄存器和所述第二寄存器的第三通用寄存器字段,所述执行还包括:从由所述第一通用寄存器字段标识的所述第一通用寄存器获取第一地址;以及将获取的所述第一地址用于取回所述存储器中的所述第一操作数;以及从由所述第二通用寄存器字段标识的所述第二通用寄存器获取所述存储器中的所述第二操作数的第二地址;以及将获取的所述第二地址用于取回所述存储器中的所述第二操作数;其中所述加载/存储分离指令指定的操作是加载对分离操作,其中所述第一寄存器处于所述第三通用寄存器字段(R3)指定的偶数地址,并且所述第二寄存器处于递增的第三通用寄存器字段(R3+1)指定的奇数寄存器地址,其中所述第一操作数存储在所述第一寄存器中并且所述第二操作数存储在所述第二寄存器中。
10.根据权利要求9所述的计算机系统,其中所述获取的所述加载对分离指令还包括第一位移字段和第二位移字段,所述执行还包括:将所述第一位移字段与获取的所述第一地址算术相加,以创建第一存储器地址用于取回所述存储器中的所述第一操作数;以及将所述第二位移字段与获取的所述第二地址算术相加,以创建第二存储器地址用于取回所述存储器中的所述第二操作数。
11.根据权利要求7所述的计算机系统,所述执行还包括:从所述多处理系统的多个处理器接收存储事件;以及将接收的所述存储操作的数据存储在所述存储器中。
12.根据权利要求10所述的计算机系统,其中针对计算机架构而定义的所述加载对分离指令由备选计算机架构的中央处理单元取回和执行,所述执行还包括:解释所述加载对分离指令以标识用于对所述加载对分离指令的操作进行仿真的预定软件例程;以及执行所述加载对分离指令包括执行所述预定软件例程。
13.一种用于取回分离存储器操作数的计算机实现的方法,所述方法包括:由处理器执行第一例程,所述第一例程包括用于取回分离存储器操作数的一个或多个指令,所述指令包括加载对分离指令以用于从存储器加载两个分离操作数以及设置条件代码值;响应于所述条件代码值指示所述两个分离操作数可能已经在具有来自另一处理器的对所述两个分离操作数中任何一个的干扰存储的情况下被加载,使第二例程被执行,所述第二例程包括用于从存储器取回所述分离存储器操作数的指令;响应于所述条件代码值指示所述两个分离操作数在没有对所述两个分离操作数中任何一个的干扰存储的情况下被加载,进行到第三例程以使用加载的所述两个分离操作数。
14.根据权利要求13所述的方法,还包括:使所述第二例程被重复,直到所述条件代码值指示所述两个分离操作数在没有对所述两个分离操作数中任何一个的干扰存储的情况下被加载。
15.根据权利要求13所述的方法,还包括:针对重复而设置限制值;响应于所述条件代码值指示所述两个分离操作数可能在具有对所述两个分离操作数中任何一个的存储干扰的情况下被加载,使所述第二例程被重复直到以下任何一个:所述第二例程已经重复了所述限制值指定的次数,或者所述条件代码值指示所述两个分离操作数在没有对所述两个分离操作数中任何一个的干扰存储的情况下被加载。
16.根据权利要求13所述的方法,所述方法还包括将所述两个分离操作数加载到通用寄存器的各自的位置。技术领域
本发明涉及计算机系统,并且特别地,涉及计算机系统处理器指令功能。xa0背景技术商标:ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="178"/>是美国纽约Armonkxa0IBM公司的注册商标,S/390、Z900和z990以及其他产品名称可以是IBM公司或其他公司的注册商标或产品名称。xa0从20世纪60年代至今,通过很多很有天赋的工程师的工作开始于已知为ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="188"/>系统360的机器,IBM创建了特殊的架构,由于其基本特征是计算系统,变成已知为“主机(mainframe)”,其操作原理通过说明可运行在IBM发明人发明并采用的指令的“主机”实现上的指令声明了机器的架构,因为其显著贡献包括多年来所声明的IBM的操作原理。2009年2月发布的第八版ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="645"/>操作原理已成为标准的公开参考SA22-7832-07并合并在IBM的z10TM主机服务器中。xa0IBM所有的1995年11月20日提交的美国专利号5,742,785“Postingxa0multiplexa0reservationsxa0withxa0axa0conditionalxa0storexa0atomicxa0operationsxa0inxa0axa0multiprocessingxa0environment”指出“在多处理环境中共享的多于一个变量可被自动更新。运行在多处理环境中的每个计算机处理器包含多于一个预留寄存器,其和这个新方法一起,被用于放置预留在多于一个共享变量中的每一个上。在程序运行的期间,可预留多个共享变量,每一个被其对应的预留寄存器预留。预留通过特殊指令被放置在共享变量上。预留寄存器记录:正在预留的共享变量的地址、共享变量地址中要更新的修改的结果的值、变量是否已被更新、预留是否有效,以及包含预留寄存器的处理器是否具有更新共享变量的特权。如果第二处理器试图读预留的共享变量的地址,预留可被无效。当遇到试图更新共享变量的指令时,如果且仅如果指定集合中的所有预留是有效的,具有未更新的修改结果的指令指定的预留的修改的共享变量的集合被自动更新。如果集合中的预留的任何一个是无效的,集合中的共享变量不被更新。条件代码报告更新是否成功或是未发生。可以测试条件代码使得指令序列可被重复直到它成功。”xa0参考图1A,其示出了现有技术的主计算机系统50的代表性组件。其他组件布置也可以采用在计算机系统中,这是本领域公知的。代表性主计算机50包括与主存储(计算机存储器2)通信的一个或多个CPU1以及到存储设备11的IO接口以及用于与其他计算机或SAN等通信的网络10。CPU1符合具有架构化指令集和架构化功能的架构。CPU1可能具有动态地址转换(DAT)3用于将程序地址(虚拟地址)转换为存储器的实际地址。DAT通常包括转换后备缓冲器(TLB)7用于高速缓存转换使得后面对计算机存储器2的块的访问不需要延迟地址转换。通常在计算机存储器2和存储器1之间采用高速缓存9。高速缓存9可以是分级的,具有可用于多于一个CPU的大的高速缓存和在大高速缓存和每个CPU之间的更小、更快(较低水平)的高速缓存。在一些实现中,较低水平的高速缓存被分开以提供单独的低水平高速缓存用于取回指令和数据存取。在一个实施方式中,指令由取指单元4通过高速缓存9从存储器2取回。指令在指令译码单元(6)中被译码并被派遣(在一些实施方式中与其他指令一起)到指令执行单元8。通常,采用几个执行单元8,例如,算术执行单元、浮点执行单元和分支指令执行单元。指令被执行单元执行、根据需要从指令指定的寄存器或存储器存取操作数。如果要从存储器2存取(加载或存储)操作数,加载存储单元5通常在被执行的指令控制之下处理存取。指令可以在硬件电路中或内部微码(固件)中或二者的组合中执行。xa0在图1B中,提供了仿真主架构的主计算机系统50的现有技术仿真的主计算机系统21的示例。在仿真的主计算机系统21中,主处理器(CPU)1是仿真的主处理器(或虚拟主处理器)且包括具有与主计算机50的处理器1不同的原生指令集架构的仿真处理器27。仿真的主计算机系统21具有仿真处理器27可访问的存储器22。在示例实施方式中,存储器27被划分为主计算机存储器2部分和仿真例程23部分。主计算机存储器2对按照主计算机架构的仿真的主计算机21的程序可用。仿真处理器27执行不同于仿真处理器1的架构的架构化指令集的原生指令、从仿真例程存储器23获取的原生指令,以及可存取用于从主计算机存储器2中的程序执行的主指令,通过采用在顺序&访问/译码例程中获取的一个或多个指令,其可译码访问的主指令以确定用于仿真访问的主指令的功能的原生指令执行例程。为主计算机系统50架构定义的其他设施可以被架构化设施例程仿真,包括设施比如通用寄存器、控制寄存器、动态地址转换以及例如I/O子系统支持和处理器高速缓存。仿真例程还可以利用仿真处理器27中可用的功能(比如通用寄存器和虚拟地址的动态转换)以提高仿真例程的性能。还可以提供特殊硬件和卸载引擎以帮助处理器27仿真主计算机50的功能。xa0在主机中,程序员使用架构化机器指令,一般现在的“C”程序员通常使用编译器应用。存储在存储介质中的这些指令可以在z/架构IBM服务器中原生地执行,或备选地执行在其他架构的机器中。它们可以在现有和未来的IBM主机服务器和IBM的其他机器(例如xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="242"/>服务器和xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="245"/>服务器)中被仿真。它们可以在使用xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="185"/>ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="187"/>AMDTM,Sunxa0Microsystems和其他制造的硬件的大量机器上运行Linux的机器中执行。除了在z/架构xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="48"/>下的这种硬件上执行,Linux也可用于使用如http://www.turbohercules.com,http://www.hercules-390.org和http://www.funsoft.com所述的仿真的机器。在仿真模式中,仿真软件被原生处理器执行以仿真被仿真的处理器的架构。xa0原生(native)处理器27通常执行仿真软件23,其包括固件或原生操作系统以执行被仿真的处理器的仿真。仿真软件23负责取回和执行被仿真的处理器架构的指令。仿真软件23维护被仿真的程序计数器以跟踪指令边界。仿真软件23一次可取回一个或多个被仿真的机器指令并将该一个或多个被仿真的机器指令转化为由原生处理器27执行的对应的原生机器指令集。这些转化的指令可被高速缓存,使得可以完成较快的转换。虽然仿真软件必须维护被仿真的处理器架构的架构规则,以便保证为被仿真的处理器写的操作系统和应用正确运行。而且,仿真软件必须提供被仿真的处理器1架构标识的资源,包括但不限于,控制寄存器、通用寄存器、浮点寄存器,动态地址转换功能包括例如段表和页表,中断机制、上下文切换机制、一天中的时间(TOD)时钟以及对I/O子系统的架构化接口,使得操作系统或设计用于运行在被仿真的处理器上的应用程序可运行在具有仿真软件的原生处理器上。xa0被仿真的特定指令被译码,并且子例程被调用以执行各个指令的功能。实现了仿真被仿真的处理器1的功能的仿真软件功能23,例如,在“C”子程序或驱动器中,或提供用于特定硬件的驱动器的一些其他方法在理解优选实施方式的说明之后都在本领域的技术之中。多种软件和硬件仿真专利包括但不限于,Beausoleil等的US5551013“Multiprocessorxa0forxa0hardwarexa0emulation”,以及Scalzi等的US6009261“Preprocessingxa0ofxa0storedxa0targetxa0routinesxa0forxa0emulatingxa0incompatiblexa0instructionsxa0onxa0axa0targetxa0processor”,以及Davidian等的US5574873“Decodingxa0guestxa0instructionxa0toxa0directlyxa0accessxa0emulationxa0routinesxa0thatxa0emulatexa0thexa0guestxa0instructions”,Gorishek等的US6308255:Symmetricalxa0multiprocessingxa0busxa0andxa0chipsetxa0usedxa0forxa0coprocessorxa0supportxa0allowingxa0non-nativexa0codexa0toxa0runxa0Inxa0axa0system,以及Lethin等的US6463582:Dynamicxa0optimizingxa0objectxa0codexa0translatorxa0forxa0architecturexa0emulationxa0andxa0dynamicxa0optimizingxa0objectxa0codexa0translationxa0method,以及Ericxa0Traut的US5790825:Methodxa0forxa0emulatingxa0guestxa0instructionsxa0onxa0axa0xa0hostxa0computerxa0throughxa0dynamicxa0recompilationxa0ofxa0hostxa0instructions;以及很多其他,说明了很多获取为用于本领域技术人员可用的目标机器的不同的机器设计的指令格式的仿真已知的方式,以及上述使用的那些商用软件技术。xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="172"/>公司所有的1997年8月29日的美国专利5,870,598“Methodxa0andxa0apparatusxa0forxa0providingxa0anxa0optimizedxa0compare-and-branchxa0Instruction”,说明了用于在RISC类型微处理器中执行的优化的比较和分支指令。微处理器中实现的指令定序器响应于比较和分支指令用于有效执行。指令定序器检测比较和分支指令并作为普通的比较指令执行它。在下一周期,指令定序器将指令转换为分支指令并提供转换的指令用于被执行单元中的一个执行。分支被执行,采用或不采用,以及正常程序流继续。Intel指令有几个缺点,包括条件代码被设置为执行的一部分,破坏可能需要重建的上下文设置。xa02007年11月13授权的专利Noxa07,296,120B2,Corrigan等的“Mechanismxa0thatxa0Providesxa0Efficientxa0Multi-Wordxa0Loadxa0Atomicity”公开了提供自动、多单词加载支持而不引起附加的存储器利用率的装置、方法和程序产品。双单词被自动加载而不使用一个或多个附加的字段且没有锁。与高速缓存未命中次数一起使用无效标记以确定加载的双单词是否已被存储和自动加载以及因此是有效的。xa0
发明内容
提供一种指令,其访问存储器并且设置指示符以指示访问是否是原子的,换言之,从存储器取回的或向存储器存储的数据在没有可能修改部分访问数据的任何干扰性存储操作的情况下被访问。xa0在本发明的实施方式中,使用用于取回分离存储器操作数的这一指令,包括执行包括用于取回分离存储器操作数的指令的第一例程,所述指令包括加载对分离指令用于从存储器加载两个分离操作数以及设置条件代码值。响应于所述条件代码值指示两个分离操作xa0数可能已在具有对两个分离操作数中任何一个的干扰存储的情况下被加载,执行包括指令从存储器取回分离的存储器操作数的第二例程。响应于所述条件代码值指示两个分离操作数在没有对两个分离操作数中任何一个的干扰存储的情况下被加载,执行用于使用加载的两个分离操作数的第三例程。xa0在一个实施方式中,重复第二例程直到所述条件代码值指示两个分离操作数在没有对两个分离操作数中任何一个的干扰存储的情况下被加载。xa0在一个实施方式中,设置重复的限制值。响应于所述条件代码值指示两个分离操作数可能已在具有对两个分离操作数中任何一个的干扰存储的情况下被加载,重复第二例程直到以下任何一个:第二例程中已经重复了限制值所指定的次数,或者条件代码值指示两个分离操作数在没有对这两个分离操作数中任何一个的干扰存储的情况下被加载。xa0在一个实施方式中,加载对分离指令使两个分离操作数被加载到通用寄存器的各自的位置。xa0在一个实施方式中,加载/存储分离指令(LSD)在多处理器系统的处理器中执行。获取加载/存储分离指令用于执行,加载/存储分离指令包括操作码,执行包括基于获取的操作码执行LSD指定的操作,操作包括访问存储器中的一个或多个操作数。响应于确定来自于多处理器系统的另一处理器的存储事件是否可能已经在访问存储器中的一个或多个操作数的期间修改了一个或多个操作数之一,第一指示符值被设置,所述第一指示符值指示来自于多处理器系统的另一处理器的存储事件是否已经在访问存储器中的一个或多个操作数的期间修改了一个或多个操作数之一。xa0在一个实施方式中,第一指示符值包括第一条件代码值或第二条件代码值中的任何一个。响应于确定存储事件在所述访问的期间可能已修改一个或多个操作数中的存储器中的第一操作数或存储器中的第二操作数,设置第一条件代码值,所述第一条件代码值指示xa0在所述访问的期间存储器中的第一操作数或存储器中的第二操作数可能已被修改。响应于确定在所述访问的期间没有存储事件修改存储器中的第一操作数或存储器中的第二操作数,设置第二条件代码值,所述第二条件代码值指示在所述访问的期间存储器中的第一操作数或存储器中的第二操作数都未被修改。xa0在一个实施方式中,LSD指令是加载对分离(LPD)指令,其中访问存储器中的一个或多个操作数包括从存储器取回第一操作数和第二操作数,还包括取回的第一操作数被存储在LPD指令指定的第一寄存器中以及取回的第二操作数被存储在LPD指令指定的第二寄存器中。xa0在一个实施方式中,其中加载对分离指令包括标识第一通用寄存器的第一通用寄存器字段、标识第二通用寄存器的第二通用寄存器字段以及标识所述第一寄存器和所述第二寄存器的第三通用寄存器字段,从第一通用寄存器字段标识的第一通用寄存器获取第一地址,以及获取的第一地址被用于取回存储器中的第一操作数。从第二通用寄存器字段标识的第二通用寄存器获取第二地址,以及获取的第二地址被用于取回存储器中的第二操作数。加载对分离操作包括将第一操作数存储在第一寄存器中,其中第一寄存器是第三通用寄存器字段标识的通用寄存器的高阶(highxa0order)部分,以及将第二操作数存储在第二寄存器中,其中第二寄存器是第三通用寄存器字段标识的通用寄存器的低阶(lowxa0order)部分。xa0在一个实施方式中,其中获取的加载对分离指令还包括第一位移字段和第二位移字段,第一位移字段与获取的第一地址算术相加以创建用于取回存储器中的第一操作数的第一存储器地址。第二位移字段与获取的第二地址算术相加以创建用于取回存储器中的第二操作数的第二存储器地址。xa0在一个实施方式中,来自多处理系统的多个处理器的存储事件被接收并且收到的存储操作的数据被存储在存储器中。xa0在一个实施方式中,其中针对计算机架构而定义的加载对分离xa0指令被取回并被备选计算机架构的中央处理单元执行,加载对分离指令被解释为标识用于仿真加载对分离指令的操作的预定的软件例程,以及执行加载对分离指令包括执行预定的软件例程以执行用于执行机器指令的方法的步骤。xa0本发明的以上和附加的目标、特征和优点在下面所写的说明中将变得更明显。xa0
附图说明
现在将参考附图仅通过举例说明本发明的实施方式,其中:xa0图1A所示为现有技术的主计算机系统的示例图;xa0图1B所示为现有技术的示例仿真主计算机系统的图;xa0图1C所示为现有技术的示例计算机系统的图;xa0图2所示为现有技术的示例计算机网络的图;xa0图3所示为现有技术的计算机系统的元件的图;xa0图4A-图4C所示为现有技术的计算机系统的详细元件;xa0图5A-图5F所示为现有技术计算机系统的机器指令格式;xa0图6所示为根据本发明的实施方式的示例指令格式;xa0图7-图9所示为本发明的实施方式的示例流程;以及xa0图10所示为本发明的实施方式的和采用的多处理器系统的示例元件。xa0
具体实施方式
现代多处理器计算机系统提供了用于两个或多个处理器访问和修改共同存储器位置的装置。这种位置据说是共享的位置,并且每个位置据说包含共享的变量。xa0计算机系统中共享变量存在的另一背景是在单个处理器中,其中独立的且不同的程序(有时称为进程)同时驻留在单个处理器中。每个进程控制称为定量的一个时间段,并且在定量结束时被未决,同时另一进程被准许访问处理器。这样执行进程,使得它们对应的xa0时间定量在时间上交错并且基于时间片轮转或优先级而被准许。进程可以访问和修改共同的位置,以及因此单个处理器中的这些进程逻辑地对共享的存储器位置操作,就像它们运行在独立的且不同的处理器上一样。xa0在两种情况下,因为两个或多个并行的进程可以更新共享的变量,存在更新完成不一致的可能性。假设两个进程中每一个被分配了递增存储器位置的任务。每个进程试图这样来完成任务:从该位置读到机器寄存器,递增机器寄存器,然后将机器寄存器的新值写到存储器。如果进程1执行读/修改/写而不干扰进程2,并且如果进程2然后执行相同的操作,共享的变量将通过被递增两次被正确地修改。xa0当两个进程的读/修改/写操作在时间上交错时,出现不一致。即,如果进程1读变量X的值,然后进程2读X的相同值,以及然后接下来的递增和写以任意顺序发生,每个进程将存储X的值等于其原始值递增一次。因此X的最终值将仅反映一次递增。将丢失一次递增。xa0获取不正确的最终值的原因是两个进程操作不一致的数据。如果进程1读X的值并想修改它,则X的逻辑驻地从共享存储器移到与进程1相关的私有寄存器。如果接下来进程2读X,并且X尚未被进程1修改,进程2读的值与X的实际值不一致,因为X当前在共享寄存器中不可访问,并且将不再可访问直到它被重写。xa0为了保证正确性,必须保证一致性。对一致行为的充分条件是保证当对共享变量X执行读/修改/写操作序列时,序列被原子地执行。“原子地”是指执行序列而在完成读X的时间和完成写X的时间之间不允许任何其他进程改变X的值。xa0有很多方法保证读/修改/写动作序列的正确性和一致性。一种方法是将这个序列封装在称为临界区的一个程序区域。临界区前面是执行锁操作的一个或多个指令,并且后面是执行解锁操作的一个或多个指令。锁和解锁操作保证在任何一个时间最多一个进程可以执xa0行临界区中的代码。如果按惯例或协议,所有其他进程通过由相同的锁和解锁机制控制的临界区更新相同的共享变量,则临界区中的读/修改/写操作可以原子地更新共享变量,因为当一个进程在临界区中执行读/修改/写进程的动作时,没有其他进程可执行对共享变量访问的干扰。xa0为了创建临界区,必须具有锁(lock)功能。在现有技术中,实现这种功能的一般方法是通过它自己对锁变量执行原子的读/修改/写的指令。用于此目的的指令是“测试和设置”指令以及“递增(或递减)”指令。xa0“测试和设置”指令读变量X,将X的一位设为值1而不管该位的原始状态,重写X,并且返回条件代码,其值等于在它被强制为值1之前的原始位。因为这个指令执行共享变量的读/修改/写,它必须被实现为原子地执行这种更新以保证运行的一致性。这一指令可用于设置保护临界区的锁,其中任意复杂度的读/修改/写序列可以一致地执行,因为锁防止了其他进程对共享变量的访问的干扰。xa0使用“测试和设置”指令创建锁,每个进程用访问锁变量的“测试和设置”指令保护临界区。执行“测试和设置”指令之后,锁变量将立刻保持值1,不管其以前的值。每个进程在执行“测试和设置”之后测试条件代码,并且仅观察到代码0(对应于初始值0)的进程可进入临界区并在临界区中执行读/修改/写序列。试图在其对应的临界区中执行读/修改/写代码的所有其他进程必须等待或做其他事直到用于临界区的锁处于解锁(0)状态。当进程完成读/修改/写序列并离开临界区时,通过在锁中存储0而清除锁,因此通过对锁执行“测试和设置”利用变量的初始值等于0,允许另一进程进入临界区。xa0“测试和设置”存在于IBMxa0370中。递增和递减可以实现为原子的读/修改/写操作,并且可用于做“测试和设置”所做的,几乎作为“测试和设置”的直接替换。它们更灵活因为它们可以原子地递增和递减共享变量,而“测试和设置”仅可设置一位。DECxa0VAX具有原子的递增和递减指令。xa0使用读/修改/写操作创建临界区有几个问题。它们是:xa01.临界区一个时间允许最多一个进程进入。如果一个进程进入临界区并且失败,整个系统失败,因为没有其他进程可进入临界区。xa02.冗长且复杂的临界区在多处理器系统中是性能瓶颈。因为在一个时间仅一个进程可进入临界区,如果其他进程必须进入同一临界区,它们必须等待直到它可用,并且在该时间的期间它们会被迫为空闲。对这个问题的理想解决方案是通过在任何临界区外面执行读/修改/写的指令序列更新共享变量。这个修改必须仔细控制使得保持一致性。xa03.因为临界区包含很多指令,用于一个进程的时间定量可在临界区中结束,并且该进程可能被未决长的时段同时其他进程控制处理器。在持有临界区的所的进程未决的时段的期间,其他进程不能进入临界区并更新该临界区控制的共享变量。xa0为了克服这些缺点,可以将对共享变量的复杂操作实现为原子地执行的单个指令。例如,DECxa0VAX具有原子的ENQUEUE和DEQUEUE指令,其中每一个同时且原子地改变最多4个共享变量,以及因此使改变一致。xa0如果按照这个方法,机器设计者必须为每个数据表示对共享变量的每个不同的操作提供原子的指令。例如,DECxa0VAX对有不同表示的队列具有不同的ENQUEUE(入列)和DEQUEUE(出列)指令。每个元素具有一个指针的队列必须被ENQUEUE/DEQUEUE指令对中的一个操作,并且每个元素具有两个指针的队列必须被不同的ENQUEUE/DEQUEUE指令对操作。xa0缺点是机器设计者必须预测每个可想到的原子操作以及每个可想到的数据表示,因为每个这种操作是极其专用的。这个方法失败,因为程序员不能轻易地为每个特定的上下文和数据表示创建并使用定制的原子操作。xa0因此,要解决的重要问题是为对共享变量的复杂更新产生定制原子操作以及执行这些原子操作的能力,使得实际更新发生在执行xa0单个指令的期间。这样,由于持有临界区的锁的进程失败或中断,多处理器系统的可靠性和性能没有风险。xa0通过使用实现在IBMxa0370上的比较和交换(Compare-and-Swap)指令,对这个问题的部分解决方案是可用的。比较和交换指令提供不被临界区保护的读/修改/写指令序列的最后步骤,以及仅在假设保证一致性和原子性的某些条件下执行写操作。使用比较和交换,为了更新共享变量,进程通过常规非原子指令首先执行除了最后的写共享变量的更新值之外的读/修改/写序列的所有动作。执行最后的写动作,进程使用比较和交换指令。比较和交换从存储中重新读变量并将存储中的当前值与保持在机器寄存器中的以前的值的拷贝相比较。如果两个值相同,比较和交换用新计算的值更新存储中的变量。如果保持在机器寄存器中的以前的值的拷贝和保持在共享存储器中的当前值不同,比较和交换不更新存储,并用共享存储器中变量的当前值的拷贝替代保持在机器寄存器中的以前的值的拷贝。指令报告在条件代码中所发生的。因为比较和交换自己执行读/修改/写动作序列,这些动作必须原子地完成以保证程序正确性。xa0比较和交换的思想是如果自从它最近被读没有其他进程改变该值,共享值可被更新。这被认为是保证一致的行为。不幸的是,有可能有不一致的更新。当第一进程在执行被比较和交换终止的读/修改/写序列中时,第二进程可以同时执行读变量的值(值A),将该值改变为新值(值B),以及当第一进程基于值A计算新值时另一进程将共享变量返回到以前的值(值A)。当第一进程到达比较和交换指令,比较和交换将成功,因为当前值和以前的值都等于A。xa0但是,对于很多应用,正确性不仅需要共享变量的以前值和当前值相等,而且存储中的变量在执行读/修改/写序列的期间它被第一次读的时间与执行比较和交换的时间之间持续地保持值A。比较和交换检测这种值的改变失败被称为ABA问题。xa0如果可能发生ABA问题,用于时访问和修改共享变量的大多数算法可能失败。有多种软件方案与比较和交换一起使用以消除或递xa0减由于ABA问题而失败的可能性。xa0对该问题的另一方法非常类似于使用比较和交换,除非它检测变量在试图更新的时间是否持续保持一个值。实际上,方案工作就像比较和交换测试变量是否已改变而不是测试当前和以前的值是否相等。方案使用称为预留的概念。xa0方案使用两个指令,“加载和预留”(Load-with-Reservation)以及“预留则写入”(Write-if-Reserved),虽然指令对使用它的多种处理器具有不同的名称。它用在xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="201"/>R-xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="181"/>处理器上,以及在DECxa0ALPHA处理器上。“加载和预留”从存储中读共享变量以及同时将该变量的地址放在中已知为预留寄存器的特定寄存器。预留寄存器监视其他进程对变量所做的改变,以及这些其他进程可以是运行在同一处理器上或其他处理器上的进程。如果任何其他进程改变变量的值,预留消失。否则它保持存在直到放置预留的进程到达“预留则写入”指令。仅当预留仍然存在时,“预留则写入”指令执行更新。如果不是,“预留则写入”指令不执行更新。在这两种情况下,指令返回指示发生了什么的条件代码。对于很多应用,进程则测试条件代码并重复“加载和预留”、修改、“预留则写入”序列直到更新成功。xa0在一个实施方式中,本发明可以通过软件实现(有时称为许可的内部代码、固件、微码、毫码、微微码等等,其中任一将与本发明一致)。参考图1A,体现本发明的软件程序代码通常被也已知为系统50的CPU(中央处理单元)1的处理器从长期存储介质7访问,比如CD-ROM驱动、带驱动或硬驱动。软件程序代码可以包含在多个已知的介质中的任一上与数据处理系统一起使用,比如盘、硬驱动或CD-ROM。代码可以分布在这种介质上,或可以从计算机存储器2或网络10中一个计算机系统的存储到用于这种其他系统的用户使用的其他计算机系统分发给用户。xa0备选地,程序代码可以包含在存储器2中,并且被处理器1使用处理器总线访问。这种程序代码包括控制多个计算机组件的功能和交互的操作系统以及一个或多个应用程序。程序代码一般被从密xa0集存储介质11分页到高速存储器2,它在其中可用于被处理器1处理。用于在物理介质上在存储器中包含软件程序代码和/或通过网络发布软件代码的技术和方法是公知的且将不在此进一步讨论。当被创建和存储在有形介质(包括但不限于电子存储器模块(RAM)、闪存、压缩盘(CD、DVD、磁带等)上时,程序代码通常称为“计算机程序产品”。计算机程序产品介质优选地在计算机系统中通常可被处理电路读,用于被处理电路执行。xa0图1C所示为可实现本发明的代表性工作站或服务器硬件系统。图1C的系统100包括代表性计算机系统101,比如个人计算机、工作站或服务器,包括可选的外部设备。工作站101包括一个或多个处理器106和根据已知技术用于连接并使能处理器106与系统101的其他组件之间的通信的总线。总线将处理器106连接到存储器105以及可包括硬驱动的长期存储107(包括例如磁介质、CD、DVD和闪存中任一)或例如带驱动。系统101也可以包括用户接口适配器,其通过总线将微处理器106连接到一个或多个接口设备,比如键盘104、鼠标103、打印机/扫描仪110和/或其他接口设备,其可以是任何用户接口设备,比如触摸屏、数字输入小键盘等。总线还将显示设备102,比如LCD屏或监视器,通过显示适配器连接到微处理器106。xa0系统101通过能使108与网络109通信的网络适配器可与其他计算机或计算机网络通信。示例的网络适配器是通信通道、令牌环、以太网或调制解调器。备选地,工作站101可使用无线接口比如CDPD(蜂窝数字分组数据)卡通信。工作站101可与局域网(LAN)或广域网(WAN)中其他这种计算机相关联,或者工作站101可以是客户/服务器布局中带有另一计算机的客户,等等。所有这些配置,以及适当的通信硬件和软件,在本领域是已知的。xa0图2所示为可以实现本发明的数据处理网络200。数据处理网络200可包括多个单独的网络,比如无线网络和有线网络,其中每个可包括多个个体工作站101、201、202、203、204。此外,本领域技术xa0人员会理解,可包括一个或多个局域网,其中局域网可包括耦合到主处理器的多个智能工作站。xa0仍参考图2,网络还可包括主机计算机或服务器,比如网关计算机(客户服务器206)或应用服务器(远程服务器208,其可访问数据仓库并且还可从工作站205直接被访问)。网关计算机206用作每个网络207的进入点。当将一个网络协议连接到另一个时需要网关。网关206可以优选地通过通信链接耦合到另一网络(例如互联网207)。网关206也可使用通信链接直接耦合到一个或多个工作站101、201、202、203、204。网关计算机可以使用可从IBM公司获取的IBMxa0eServerTMntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="239"/>z10TM服务器实现。xa0实现本发明的软件编程代码通常被系统101的处理器106从长期存储介质107访问,比如CD-ROM驱动或硬驱动。软件编程代码可以实现在多种已知与数据处理系统一起使用的介质中的任一上,比如盘、硬驱动,或CD-ROM。代码可以分布在这种介质上,或可通过网络从存储器或一个计算机系统的存储向其他计算机系统发布给用户210、211用于被这种其他系统的用户使用。xa0备选地,编程代码111可以实现在存储器105中,并且使用处理器总线被处理器106访问。这种编程代码包括控制多种计算机组件的功能和交互的操作系统以及一个或多个应用程序112。程序代码一般从密集存储介质107到高速存储器105分页,可用于被处理器106处理。在存储器中、在物理介质上实现软件编程代码,和/或通过网络发布软件代码的技术和方法是公知的且此处不会进一步说明。程序代码,当被创建和存储在有形介质(包括但不限于电子存储器模块(RAM)、闪存、压缩盘(CD)、DVD、磁带等)上时通常称为“计算机程序产品”。计算机程序产品介质通常可优选地在计算机系统中被处理电路读用于被处理电路执行。xa0处理器最容易得到的高速缓存(一般比处理器的其他高速缓存更快且更小)是最低的(L1或一级)高速缓存以及主存储(主存储器)是最高级的高速缓存(L3,如果有3级)。最低级的高速缓存xa0通常被分成保持要执行的机器指令的指令高速缓存(I-Cache)和保持数据操作数的数据高速缓存(D-Cache)。xa0参考图3,示范处理器实施方式示出为处理器106。通常采用一级或多级高速缓存303来缓冲存储器块,从而改进处理器性能。高速缓存303是保持可能要用的存储器数据的高速缓存行的高速缓冲。典型的高速缓存行是64、128或256字节的存储器数据。通常采用单独的高速缓存用于缓存指令而不是缓存数据。高速缓存一致性(存储器和高速缓存中行的拷贝的同步)通常由本领域公知的多种“Snoop”算法提供。处理器系统的主存储105通常称为高速缓存。在具有4级高速缓存303的处理器系统中,主存储105有时被称为5级(L5)高速缓存,因为它通常更快且仅保持计算机系统可用的非易失存储(DASD,带等等)的一部分。主存储105“缓存”由操作系统换入换出主存储105的数据的页。xa0程序计数器(指令计数器)311跟踪当前要执行的指令的地址。在z/架构处理器中的程序计数器是64位,并且可被截断为31或24位以支持以前的寻址限制,程序计数器通常实现在计算机的PSW(程序状态字)中使得它在上下文切换的期间持续。因此,具有程序计数器值的进行中的程序可被例如操作系统(从程序环境到操作系统环境的上下文切换)中断。程序的PSW当程序未激活时,保持程序计数器值,并且当操作系统在运行时,使用操作系统的程序计数器(在PSW中)。通常,程序计数器递增的量等于当前指令的字节数。RISC(精简指令集计算)指令通常是固定长度,而CISC(复杂指令集计算)指令通常是可变长度。IBMxa0z/架构的指令是具有2、4或6字节长度的CISC指令。程序计数器311被例如上下文切换操作或分支指令的分支采取操作修改。在上下文切换操作中,当前程序计数器值与关于被执行的程序(比如条件代码)的其他状态信息一起被保存在程序状态字(PSW),以及新程序计数器的值被加载,指向要执行的新程序模块的指令。执行分支采取操作以便允许程序做决定或通过将分支指令的结果加载到程序计数器311中在程序中循环。xa0通常,采用取指单元305为处理器106取回指令。取回单元或者取回“下一顺序指令”,分支采取指令的目标指令,或者上下文开关之后的程序的第一指令。现代取指单元通常采用预取回技术基于可能使用预取回的指令的可能性推测地预取回指令。例如,取回单元可取回16字节指令,包括下一顺序指令和进一步的顺序指令的附加字节。xa0然后取回的指令被处理器106执行。在一个实施方式中,向取回单元的分派单元306传递取回的指令。分派单元译码指令并向适当的单元307、308、310转发关于被译码的指令的信息。执行单元307将通常从取指单元305接收关于译码的算术指令的信息并将根据指令的操作码对操作数执行算术操作。操作数优选地从存储器105、架构化寄存器309或从被执行的指令的立即字段被提供给执行单元307。执行的结果,当被存储时,被存储在存储器105、寄存器309或其他机器硬件(比如控制寄存器、PSW寄存器等等)中。xa0处理器106通常具有用于执行指令的功能的一个或多个执行单元307、308、310。参考图4A,执行单元307可通过接口逻辑407与架构化通用寄存器309、译码/分派单元306、加载存储单元310和其他处理器单元401通信。执行单元307可采用几个寄存器电路403、404、405以保持算术逻辑单元(ALU)402将操作的信息。ALU执行算术操作比如加、减、乘和除以及逻辑功能比如与、或和异或、循环和移位。优选地,ALU支持相关设计的专用操作。其他电路可提供其他架构化的设施408,包括例如条件代码和恢复支持逻辑。通常,ALU操作的结果保持在输出寄存器电路406中,其可将结果转发给多种其他处理功能。有很多处理器单元的布局,本说明仅想提供一个实施方式的代表性理解。xa0例如,ADD指令将在具有算术和逻辑功能的执行单元307中执行,而例如浮点指令可以在具有专用浮点能力的浮点执行中执行。优选地,通过对操作数执行操作码定义功能,执行单元操作由指令标识的操作数。例如ADD指令可被执行单元307对在指令的寄存器xa0字段标识的两个寄存器309中发现的操作数执行。xa0执行单元307对两个操作数执行算术加法,并且将结果存储在第三操作数中,其中第三操作数可以是第三寄存器或两个源寄存器之一。执行单元优选地使用算术逻辑单元(ALU)402,其能执行多种逻辑功能比如移位、循环、与、或和异或以及多种代数功能包括加、减、乘、除中的任一。一些ALU402被设计用于标量运算以及一些用于浮点。数据根据架构可以是Bigxa0Endian(其中最低有效字节在最高字节地址)或Littlexa0Endian(其中最低有效字节在最低字节地址)。IBMz/架构是Bigxa0Endian。符号字段可以是符号和大小,根据架构,可以是1的补(complement)或2的补。2的补数对于ALU不需要设计减法能力是有利的,因为2的补中的负值或正值仅需要ALU中的加法。数字通常描述为缩写,例如,12位字段定义4096字节块的地址且通常描述为4K字节(千字节)块。xa0参考图4B,通常向分支单元308发送用于执行分支指令的分支指令信息,其通常采用分支预测算法比如分支历史表432在其他条件操作完成之前预测分支的结果。当前分支指令的目标将被取回并在条件操作完成之前推测地执行。当条件操作完成时,推测执行的分支指令基于条件操作的条件和推测的结果被完成或丢弃。典型的分支指令可测试条件代码,并且如果条件代码满足分支指令的分支要求,分支到目标地址,可以基于例如包括寄存器字段中或指令的立即字段中发现的几个数计算目标地址。分支单元308可采用具有多个输入寄存器电路427、428、429和输出寄存器电路430的ALU426。分支单元308可与例如通用寄存器309、译码分派单元306或其他电路425通信。xa0一组指令的执行可以因多种原因被中断,例如包括操作系统发起的上下文切换、导致上下文切换的程序异常或错误、导致上下文切换的I/O中断信号或多个程序(在多线程环境中)的多线程活动。优选地,上下文切换动作保存有关当前运行的程序的状态信息以及然后加载关于被调用的另一程序的状态信息。状态信息可以被保存xa0在例如硬件寄存器或存储器中。状态信息优选地包括指向要执行的下一指令的程序计数器值、条件代码、存储器转换信息和架构化的寄存器内容。上下文切换活动可被硬件电路、应用程序、操作系统程序或固件代码(微码、微微码或许可内部代码(LIC))单独或组合地练习。xa0处理器根据指令定义的方法访问操作数。指令可使用指令的一部分的值提供立即操作数,可提供明确地指向通用寄存器或专用寄存器(例如浮点寄存器)的一个或多个寄存器字段。指令可使用操作码字段标识的隐含的寄存器作为操作数。指令可为操作数使用存储器位置。操作数的存储器位置可被寄存器、立即字段或以z/架构长位移设施为例的寄存器和立即字段的组合提供,其中指令定义基寄存器、索引寄存器和立即字段(位移字段)相加以提供例如存储器中操作数的地址。此处位置通常暗示主存储器(主存储)中的位,除非另外说明。xa0参考图4C,处理器使用加载/存储单元310访问存储。加载/存储单元310可通过在存储器303中获取目标操作数的地址并在寄存器309中或另一存储器303位置加载操作数执行加载操作,或可执行存储操作通过在存储器303中获取目标操作数的地址并将从寄存器309或目标操作数位置中的另一存储器303位置获取的数据存储在存储器303中。加载/存储单元310可以是推测的并且可按相对于指令序列无序的顺序访问存储器,但是加载/存储单元310必须对程序保持指令按顺序执行的迹像。加载/存储单元310可与通用寄存器309、译码/分派单元306、高速缓存/存储器接口303或其他元件455通信且包括多种寄存器电路、ALU458和控制逻辑463以计算存储地址并提供管道排序以使操作有序。一些操作可以无序但是加载/存储单元提供功能使无序操作对程序表现得就像已被有序执行一样,这在本领域是公知的。xa0优选地,应用程序“看见”的地址一般称为虚拟地址。虚拟地址有时称为“逻辑地址”和“有效地址”。这些虚拟地址是虚拟的在于它们通xa0过多种动态地址转换(DAT)312技术被重定向到物理存储器位置,包括但不限于简单地以偏移地址最为虚拟地址的前缀,通过一个或多个转换表转换虚拟地址,转换表优选地包括单独的或组合的至少一个段表和页表,优选地,段表具有指向页表的入口。在z/架构中提供分级转换,包括区域第一表、区域第二表、区域第三表、段表和可选的页表。地址转换的性能通常通过使用旁路转换缓冲(TLB)而被改进,其包括条目将虚拟地址映射到相关联的物理存储器位置。当DATxa0312使用转换表转换虚拟地址时,条目被创建。接下来虚拟地址的使用则可使用快速TLB的条目而不是慢速的顺序的转换表访问。TLB内容可以被包括LRU(最近最少使用)的多种替代算法管理。xa0在处理器是多处理器系统的处理器的情况下,每个处理器负责使共享资源比如I/O、高速缓存、TLB和存储器为一致性而保持互锁。通常,将使用“snoop”技术维持高速缓存一致性。在snoop环境中,每个高速缓存行可被标记为共享状态、独占状态、改变状态、无效状态等等中的任何一个以实现共享。xa0I/O单元304为处理器提供用于附于外围设备的装置,包括例如带、盘、打印机、显示器和网络。I/O单元通常由软件驱动器呈现给计算机程序。在主机中比如IBM的z/系列、通道适配器和开放系统适配器是在操作系统和外围设备之间提供通信的主机的I/O单元。xa0z/架构操作原理的下列说明描述了计算机系统的架构视图:xa0存储xa0计算机系统包括主存储中的信息,以及寻址、保护和引用以及改变记录。寻址的一些方面包括地址的格式、地址空间的概念、多种类型的地址,以及一种类型的地址转换为另一种类型的地址的方式。某些主存储包括持久分配的存储位置。主存储为系统提供数据的直接可寻址的快速访问存储。数据和程序必须在它们被处理之前被加载到主存储中(从输入设备)。xa0主存储可包括一个或多个较小、较快访问的缓冲存储,有时称为高速缓存。高速缓存通常与CPU或I/O处理器物理相关联。不同存储介质的物理构造和使用的效果,除了在性能上,一般不会被程序察觉。xa0单独的高速缓存可被保持用于指令和数据操作数。高速缓存中的信息被保持为称为高速缓存块或高速缓存行(或简称行)的完整边界上的连续字节。模型可提供EXTRACTxa0CACHExa0ATTRIBUTE(提取高速缓存属性)指令,其返回高速缓存行的字节数。模型还可提供PREFETCHxa0DATA(预取数据)和PREFETCHxa0DATAxa0RELATIVExa0LONG(预取数据相对长)指令,其导致预取回存储到数据或指令高速缓存或从高速缓存释放数据。xa0存储被视为位的长水平串。对于大多数操作,访问存储按从左到右的顺序进行。位串被细分成8位的单元。一个8位单元被称为一个字节,其是所有信息格式的基本构建块。存储中的每个字节位置被唯一的非负整数标识,其是该字节位置的地址,或简单地,字节地址。相邻的字节位置具有连续的地址,左边从0开始并且按从左至右的顺序前进。地址是无符号的二进制整数并且是是24、31或64位。xa0信息在存储和CPU或通道子系统之间传送,一次一字节或一组字节。除非另外指定,存储中的一组字节被组中的最左字节寻址。组中的字节数隐含地或显式地被要执行的操作指定。当在CPU操作中使用时,一组字节被称为一个字段。在每组字节中,位按照从左至右的顺序计数。最左的位有时称为“高阶”位,最右的位称为“低阶”位。但是位数不是存储地址。仅字节可被寻址。对存储中的字节的单个位操作,必须访问整个字节。字节中的位被从左至右从0到7编号。地址中的位对于24位地址可以编号为8-31或40-63,或对于31位地址可以编号为1-31或30-63;对于64位地址它们被编号为0-63。在多个字节的任何其他固定长度格式中,组成格式的位被从0开始连续编号。为了检测错误,以及优选地为了校正,可以与每个xa0字节或字节组一起传送一个或多个校验位。这种校验位由机器自动产生并且不能被程序直接控制。存储容量用字节数表示。当存储-操作数字段的长度被指令的操作代码暗示,可以说字段具有固定长度,其可以是1、2、4、8或16字节。对于一些指令可以暗示较大的字段。当存储-操作数字段的长度未被暗示而是被明确地声明时,可以说字段具有可变长度。可变长度操作数可以长度不同,增量为1字节。当信息被放置在存储中时,仅包括在指定字段中的那些字节位置的内容被替换,即使到存储的物理路径的宽度可以大于被存储的字段的长度。xa0信息的某些单元必须在存储中的完整边界上。当它的存储地址是单元字节长度的倍数时,边界被称为对于信息单元而言是完整的。特定名称被给予完整边界上的2、4、8和16字节的字段。半字是两字节边界上的一组两个连续字节并且是指令的基本构建块。字是4字节边界上的一组4个连续字节。双字是8字节边界上的一组8个连续字节。四字是是16字节边界上的一组16个连续字节。当存储地址指定半字、字、双字和四字时,地址的二进制表示分别包含1、2、3或4个最右的0位。指令必须在两字节完整边界上。大多数指令的存储操作数没有边界对准要求。xa0在实现用于指令和数据操作数的单独的高速缓存的模型上,如果程序存储在指令随后被从其取回的高速缓存行中,可以体验显著的延迟,不论存储是否改变随后被取回的指令。xa0指令xa0通常,CPU的操作被存储中被顺序执行的指令控制,每次一个,从左至右按照存储地址的升序。顺序操作中的改变可由分支、LOADxa0PSW(加载PSW)、中断、SIGNALxa0PROCESSOR(信号处理器)命令或手工干预引起。xa0优选地,指令包括2个主要部分:xa0●操作代码(操作码),其指定要执行的操作xa0●可选地,指定参与的操作数。xa0在图5A-图5F中示出z/架构的指令格式。指令可简单地提供操作码501、或操作码和多个字段包括立即操作数或用于在寄存器或存储器中定位操作数的寄存器说明符。操作码可向硬件指示隐含的资源(操作数等)将被使用,比如一个或多个特定通用寄存器(GPR)。操作数可被分成三类:位于寄存器中的操作数、立即操作数和存储中的操作数。操作数可被显式地或隐含地指定。寄存器操作数可位于通用、浮点、访问或控制寄存器中,寄存器的类型被操作码标识。通过在指令中称为R字段的4位字段中标识寄存器指定包含操作数的寄存器。对于一些指令,操作数位于隐含指定的寄存器中,寄存器由操作码隐含。立即操作数包含在指令中,并且包含立即操作数的8位、16位或32位字段被称为I字段。存储中的操作数可具有隐含的长度;由位掩码指定;由4位或8位长度规范指定,在指令中称为L字段;或具有由通用寄存器的内容指定的长度。通过使用通用寄存器的内容作为地址的一部分的格式指定存储中操作数的地址。这支持:xa0通过使用缩写符号指定完整的地址xa0使用采用通用寄存器用于操作数的指令执行地址操作xa0独立于数据区的位置通过直接使用从其他程序接收的地址,不改变指令流操作,通过程序方式修改地址。xa0用于指向存储的地址或者包含在指令中R字段指定的寄存器中或者根据分别由指令中B、X和D字段指定的基址、索引和位移计算。当CPU处于访问寄存器模式时,B或R字段除了用于指定地址之外可指定访问寄存器。为了说明指令的执行,操作数优选地被指定为第一和第二操作数,并且在某些情况下,第三和第四操作数。通常,两个操作数参与指令执行,并且结果替代第一操作数。xa0指令长度为一个、两个或三个半字并且必须位于存储中在半字边界上。参考描述指令格式的图5A-图5F,每个指令为25个基本格式中的一个:E501、I502、RI503xa0504、RIE505xa0551xa0552xa0553xa0554、RILxa0506xa0507、RIS555、RR510、RRE511、RRF512xa0513514、RRS、RS516xa0517、RSI520、RSL521、RSY522xa0523、RX524、RXE525、RXF526、RXY527、S530、SI531、SIL556、SIY532、SS533xa0534xa0535xa0536xa0537、SSE541和SSF542,以及RRF的3种变化,RI、RIL、RS和RSY的两种,RIE和SS的5种。xa0通常,格式名称指示参与操作的操作数的类和关于字段的一些细节:xa0●RIS表示寄存器和立即操作以及存储操作xa0●RRS表示寄存器和寄存器操作以及存储操作xa0●SIL表示存储和立即操作,带有16位立即字段xa0在I、RR、RS、RSI、RX、SI和SS格式中,指令的第一字节包含操作码。在E、RRE、RRF、S、SIL和SSE格式中,指令的前2个字节包含操作码,除了对于S格式的一些指令以外,操作码仅在第一字节。在RI和RIL格式中,操作码在第一字节和指令的比特位置12-15。在RIE、RIS、RRS、RSL、RSY、RXE、RXF、RXY和SIY格式中,操作码在第一字节和指令的第六字节。操作码的第一或唯一字节的前两位指定指令的长度和格式,如下:xa0在RR、RRE、RRF、RRR、RX、RXE、RXF、RXY、RS、RSY、RSI、RI、RIE和RIL格式中,R1字段指定的寄存器的内容被称为第一操作数。包含第一操作数的寄存器有时被称为“第一操作数位置”,以及有时称为“寄存器R1”。在RR、RRE、RRF和RRR格式中,R2字段指定包含第二操作数的寄存器,并且R2字段可指定与R1相同的寄存器,在RRF、RXF、RS、RSY、RSI和RIE格式中,依据指令使用R3字段。在RS和RSY格式中,R3字段可以替换为指定掩码的M3字段。R字段指定通用指令中的通用或访问寄存器、控制指令中的通用寄存器,以及浮点指令中的浮点寄存器或通用寄存器。对于通用和控制寄存器,依据指令,寄存器操作数在64位寄存器的32-63比特位置中或占据整个寄存器。xa0在I格式中,8位立即数据字段的内容,指令的I字段,直接被xa0用作操作数。在SI格式中,8位立即数据字段的内容,指令的I2字段,直接被用作第二操作数。B1和D1字段指定第一操作数,其长度为1字节。在SIY格式中,操作是相同的,除了DH1和DL1字段代替D1字段被使用。在指令ADDxa0HALFWORDxa0IMMEDIATE,COMPARExa0HALFWORDxa0IMMEDIATE,LOADxa0HALFWORDxa0IMMEDIATE和MULTIPLYxa0HALFWORDxa0IMMEDIATE的R1格式,指令的I2字段的16位的内容直接用于带符号的二进制整数,并且R1字段指定第一操作数,依据指令,其长度为32或64位。对于指令TESTxa0UNDER.MASK(TMHH,TMHL,TMLH,TMLL),I2字段的内容用作掩码,并且R1字段指定第一操作数,其长度为64位。xa0对于指令INSERTxa0IMMEDIATE,ANDxa0IMMEDIATE,ORxa0IMMEDIATE和LOADxa0LOGICALxa0IMMEDIATE,I2字段的内容用作无符号的二进制整数或逻辑值,并且R1字段指定第一操作数,其长度为64位。对于RI和RSI格式的相对分支指令,16位I2字段的内容用作指定半字数量的有符号的二进制整数。这个数,当被加到分支指令的地址时,指定分支地址。对于RIL格式的相对分支指令,I2字段是32位且以相同方式使用。xa0对于RI和RSI格式的相对分支指令,16位I2字段的内容用作指定半字数量的有符号的二进制整数。这个数,当被加到分支指令的地址时,指定分支地址。对于RIL格式的相对分支指令,I2字段是32位且以相同方式使用。对于RIE格式指令COMPARE,IMMEDIATExa0ANDxa0BRANCHxa0RELATIVE和COMPARExa0LOGICALxa0IMMEDIATExa0ANDxa0BRANCHxa0RELATIVE,8位I2字段的内容直接用作第二操作数。对于RIE格式指令COMPARExa0IMMEDIATExa0ANDxa0BRANCH,COMPARExa0IMMEDIATExa0ANDxa0TRAP,COMPARExa0LOGICALxa0IMMEDIATExa0ANDxa0BRANCH和COMPARExa0LOGICALxa0IMMEDIATExa0ANDxa0TRAP,16位I2字段的内容直接用作第二操作数。对于RIE格式指令COMPARExa0ANDxa0BRANCHxa0RELATIVE,COMPARExa0IMMEDIATExa0ANDxa0BRANCHxa0RELATIVE,COMPARE,xa0LOGICAL,ANDxa0BRANCHxa0RELATIVE和COMPARExa0LOGICALxa0IMMEDIATExa0ANDxa0BRANCHxa0RELATIVE,16位I4字段的内容用作指定半字数量的有符号的二进制整数,其被加到指令的地址以形成分支地址。xa0对于RIL格式指令ADDxa0IMMEDIATExa0ADDxa0LOGICALxa0IMMEDIATE,ADDxa0LOGICALxa0WITHxa0SIGNEDxa0IMMEDIATE,COMPARE,IMMEDIATE,COMPARExa0LOGICALxa0IMMEDIATE,LOADxa0IMMEDIATE和MULTIPLYxa0SINGLExa0IMMEDIATE,32位I2字段的内容直接用作第二操作数。xa0对于RIS格式指令,8位I2字段的内容直接用作第二操作数。在SIL格式中,16位I2字段的内容直接用作第二操作数。B1和D1字段指定第一操作数,如下所述。xa0在RSL、SI、SIL、SSE和大多数SS格式中,B1字段指定的通用寄存器的内容被加上D1字段的内容以形成第一操作数地址。在RS、RSY、S、SIY、SS和SSE格式中,B2字段指定的通用寄存器的内容被加上D2字段或DH2和DL2字段的内容以形成第二操作数地址。在RX、RXE、RXF和RXY格式中,X2和B2字段指定的通用寄存器的内容被加上D2字段或DH2和DL2字段的内容以形成第二操作数地址。在RIS和RRS格式中,以及在一个SS格式中,B4字段指定的通用寄存器的内容被加上D4字段的内容以形成第四操作数地址。xa0在带有单个8位长度字段的SS格式中,对于指令AND(NC).EXCLUSIVExa0OR(XC),MOVE(MVC),MOVExa0NUMERICS,MOVExa0ZONES和OR(OC),L指定由第一操作数地址指定的字节的右边附加操作数字节的数量。因此,第一操作数的字节的长度是1-256,对应于L的长度代码0-255。存储结果代替第一操作数并且从不存储在地址和长度指定的字段外面。在这个格式中,第二操作数与第一操作数具有相同长度。上述定义的变化适用于EDIT,EDITxa0ANDxa0MARK,PACKxa0ASCII,PACKxa0UNICODE,TRANSLATE,TRANSLATExa0ANDxa0xa0TEST,UNPACKxa0ASCII和UNPACKxa0UNICODE。xa0在带有2个长度字段的SS格式中,以及在RSL格式中,L1指定由第一操作数地址指定的字节的右边附加操作数字节的数量。因此,第一操作数的字节的长度是1-16,对应于L1中的长度代码0-15。类似地,L2指定由第二操作数地址指定的位置右边附加操作数字节的数量。结果代替第一操作数并且从不存储在地址和长度指定的字段外面。如果第一操作数比第二操作数长,第二操作数左边用0扩展直到第一操作数的长度。这个扩展不修改存储中的第二操作数。在带有2个R字段的SS格式中,如MOVExa0TOxa0PRIMARY,MOVExa0TOxa0SECONDARY和MOVExa0WITHxa0KEY指令所使用的,R1字段指定的通用寄存器的内容是称为实际长度的32位无符号值。操作数都是称为有效长度的长度。有效长度等于实际长度或256,无论哪个更小。指令设置条件代码以实现编程循环以移动由实际长度指定的字节总数。带有2个R字段的SS格式也用于指定寄存器的范围以及用于LOADxa0MULTIPLExa0DISJOINT指令的两个存储操作数以及指定一个或两个寄存器以及用于PERFORMxa0LOCKEDxa0OPERATION指令的一个或两个存储操作数。xa0B1、B2、X2或B4字段中任一中的0指示缺少对应的地址成分。对于缺少的成分,使用0通知中间和,不管寄存器0的内容。0的移位没有特殊的意义。xa0当前PSW的位31和32是寻址模式位。位31是扩展寻址模式位,并且位32是基本寻址模式位。这些位控制地址生成产生的有效地址的大小。当当前PSW的位31和32都是0时,CPU处于24位寻址模式,并且生成24位指令和操作数有效地址。当当前PSW的位31是0且位32是1时,CPU处于31位寻址模式,并且生成31位指令和操作数有效地址。当当前PSW的位31和32都是1时,CPU处于64位寻址模式,并且生成64位指令和操作数有效地址。CPU执行指令包括产生指令和操作数的地址。xa0当从当前PSW指定的位置取回指令时,用指令中的字节数递增xa0指令地址,并且执行指令。然后通过使用指令地址的新值以按顺序取回下一指令重复相同步骤。在24位寻址模式中,指令地址环绕,在指令地址224-2的半字后面跟着在指令地址0的半字。因此,在24位寻址模式中,PSW比特位置104的任何执行被丢失,作为更新指令地址的结果。在31位或64位寻址模式中,指令地址类似地环绕,在指令地址231-2或264-2的半字后面分别跟着在指令地址0的半字。PSW比特位置97或64的执行分别被丢失。xa0针对存储的操作数地址从中间值获取,其或者包含在由指令中的R字段指定的寄存器中或者根据3个二进制数的和计算:基址、索引和位移。基址(B)是包含在由程序中4位字段指定的通用寄存器中的64位数,在指令中称为B字段。基址可用作独立寻址每个程序和数据区的方式。在数组型计算中,它可指定数组的位置,以及在记录型处理中,它可标识记录。基址用于寻址整个存储。基址也可用于索引。xa0索引(X)是包含在由程序中4位字段指定的通用寄存器中的64位数,在指令中称为X字段。它仅包括在由RX-、RXE-和RXY-格式指令指定的地址中。RX-、RXE-、RXF-和RXY-格式指令允许双索引;即,可使用索引提供数组中元素的地址。xa0位移(D)是包含在指令中称为D字段的字段中的12位或20位数。12位位移是无符号的且提供在基址指定的位置之后最多4095字节的相对寻址。20位位移是有符号的且提供在基址位置之后最多524287字节或基址位置之前最多524288字节的相对寻址。在数组型计算中,位移可用于指定与一个元素相关联的很多项中的一个。在记录的处理中,位移可用于标识记录中的项。12位位移在某些格式的指令的20-31比特位置。在一些格式的指令中,第二个12位位移也在指令中,在比特位置36-47中。xa020位位移仅在RSY、RXY或SIY格式的指令中。在这些指令中,D字段由在比特位置20-31的DL(低)字段和在比特位置32-39的DH(高)字段组成。当安装了长位移设施时,通过将DH字段的xa0内容附加在DL字段内容的左边形成位移的数值。当未安装长位移设施时,通过附加在DL字段内容的左边附加8个0位,并且忽略DH字段的内容而形成位移的数值。xa0在形成中间和时,基址和索引被视为64位二进制整数。12位位移被视为12位无符号二进制整数,且52个0位被附加在左边。20位位移被视为20位有符号二进制整数,且等于符号位的44位被附加在左边。这三个被添加为64位二进制数,忽略溢出。和总是64位长且被用作中间值以形成生成的地址。中间值的位被编号为0-63。B1、B2、X2或B4字段的任一中的0指示缺少对应的地址组件。对于缺少的组件,用0形成中间和,不管通用寄存器0的内容。0的位移没有特殊意义。xa0当指令描述指定R字段指定的通用寄存器的内容用于寻址存储中的操作数时,寄存器内容用作64位中间值。xa0指令可为地址计算以及作为操作数的位置指定同一通用寄存器。如果有的话,地址计算在寄存器被操作改变之前完成。除非在单个指令定义中指示,生成的操作数地址指定存储中操作数的最左字节。xa0生成的操作数地址总是64位长,且位被编号为0-63。从中间值获取生成的地址的方式取决于当前寻址模式。在24位寻址模式中,中间值的位0-39被忽略,生成的地址的位0-39被强制为0,并且中间值的位40-63变成生成的地址的位40-63。在31位寻址模式中,中间值的位0-32被忽略,生成的地址的位0-32被强制为0,并且中间值的位33-63变成生成的地址的位33-63。在64位寻址模式中,中间值的位0-63变成生成的地址的位0-63。负值可在索引中和基址寄存器中使用。在31位寻址模式中这些值的位0-32被忽略,且在24位寻址模式中位0-39被忽略。xa0对于分支指令,当分支被采取时要执行的下一指令的地址被称为分支地址。根据分支指令,指令格式可以是RR、RRE、RX、RXY、RS、RSY、RSI、RI、RIE或RIL。在RS、RSY、RX和RXY格式xa0中,分支地址由基址、位移以及在RX和RXY格式中的索引指定。在这些格式中,生成中间值遵循与生成操作数地址中间值相同的规则。在RR和RRE格式中,R2字段指定的通用寄存器的内容用作从其形成分支地址的中间值。通用寄存器0不能被指定为包含分支地址。R2字段中的值0导致指令执行而不分支。xa0相对分支指令在RSI、RI、RIE和RIL格式中。在相对分支指令的RSI、RI和RIE格式中,I2字段的内容被视为指定半字数量的16位有符号二进制整数。在RIL格式中,I2字段的内容被视为指定半字数量的32位有符号二进制整数。分支地址是I2字段指定的半字数量加上相对分支指令的地址。xa0RSI、RI、RIE或RIL格式中相对分支指令的64位中间值是2个加数的和,来自比特位置0的溢出被忽略。在RSI、RI或RIE格式中,第一加数是I2字段的内容,其中一个0位附加在右边且等于内容的符号位的47个位附加在左边,除了对COMPARExa0ANDxa0BRANCHxa0RELATIVE,COMPARExa0IMMEDIATExa0ANDxa0BRANCHxa0RELATIVE,COMPARExa0LOGICALxa0ANDxa0BRANCHxa0RELATIVE以及COMPARExa0LOGICALxa0IMMEDIATExa0ANDxa0BRANCHxa0RELATIVE之外,第一加数是I4字段的内容,附加的位如以上对I2字段所述。在RIL格式中,第一加数是I2字段的内容,其中一个0位附加在右边且等于内容的符号位的31个位附加在左边。在所有格式中,第二加数是分支指令的64位地址。在该地址被更新为下一顺序指令的地址之前,分支指令的地址是PSW中的指令地址,或者如果使用了EXECUTE,它是EXECUTE指令的目标的地址。如果在24位或31位寻址模式使用EXECUTExa0分支指令总是64位长,其中位被从0-63编号。分支地址代替当前PSW的位64-127。从中间值获取分支地址的方式取决于寻址模式。对于改变寻址模式的那些分支指令,使用新的寻址模式。在24位寻址模式中,中间值的位0-39被忽略,分支地址的位0-39被置为0,并且中间值的位40-63变成分支地址的位40-63。在31位寻址模xa0式中,中间值的位0-32被忽略,分支地址的位0-32被置为0,并且中间值的位30-63变成分支地址的位30-63。在64位寻址模式中,中间值的位0-63变成分支地址的位0-63。xa0对于多个分支指令,分支取决于满足指定的条件。当不满足条件时,不采用分支,继续执行正常顺序的指令,并且不使用分支地址。当采取分支时,分支地址的位0-63代替当前PSW的位64-127。分支地址不用于访问存储作为分支操作的一部分。由于奇数的分支地址而导致的规范异常和由于在分支位置取回指令的访问异常不被认为是分支操作的一部分而被认为是与在分支位置执行指令相关联的异常。xa0分支指令,比如BRANCHxa0ANDxa0SAVE,可为分支地址计算指定同一通用寄存器并且作为操作数的位置。在剩余的操作执行之前完成分支地址计算。xa0在第4章“控制”说明的程序状态字(PSW)包含正确执行程序所需的信息。PSW用于控制指令顺序并且保持和指示与当前执行的程序有关的CPU的状态。激活的或控制中的PSW被称为当前PSW。分支指令执行做判断、循环控制和子程序链接的功能。分支指令通过将新指令地址导入当前PSW影响指令顺序。带有16位I2字段的相对分支指令允许分支到相对与分支指令的地址偏移最多加64K-2字节或减64K字节的位置,而不使用基寄存器。带有32位I2字段的相对分支指令允许分支到相对与分支指令的地址偏移最多加4G-2字节或减4G字节的位置,而不使用基寄存器。xa0决策手段由BRANCHxa0ONxa0CONDITION,BRANCHxa0RELATIVExa0ONxa0CONDITION和BRANCHxa0RELATIVExa0ONxa0CONDITIONxa0LONG指令提供。这些指令检查反映算术、逻辑和I/O操作中的大多数的结果的条件代码。由2位组成的条件代码提供4个可能的条件代码设置:0、1、2和3。xa0任一设置的具体意义取决于设置条件代码的操作。例如,条件代码反映条件如0、非0、第一操作数高、等于、溢出和子通道忙。xa0一旦被设置,条件代码保持不变,直到被使不同的条件代码被设置的指令修改。xa0可通过使用BRANCHxa0ONxa0CONDITION,BRANCHxa0RELATIVExa0ONxa0CONDITION和BRANCHxa0RELATIVExa0ONxa0CONDITIONxa0LONG测试地址算术和计数操作的结果,执行循环控制。对于一些特别频繁的算术和测试的组合,提供BRANCHxa0ONxa0COUNT,BRANCHxa0ONxa0INDEXxa0HIGH和BRANCHxa0ONxa0INDEXxa0LOWxa0ORxa0EQUAL,以及也提供了这些指令的相对分支等效。这些分支,被指定,为这些任务提供提高的性能。xa0当不需要改变寻址模式时,子程序链接由BRANCHxa0ANDxa0link和BRANCHxa0ANDxa0SAVE指令提供。(BRANCHxa0ANDxa0SAVE的这个讨论也适用于BRANCHxa0RELATIVExa0ANDxa0SAVE和BRANCHxa0RELATIVExa0ANDxa0SAVExa0LONG。)这些指令都允许不仅引入新指令地址而且保存返回地址和相关联的信息。返回地址是存储中跟在分支指令之后指令的地址,除了它是跟在以分支指令作为其目标的EXECUTE指令之后的地址之外。xa0BRANCHxa0ANDxa0link和BRANCHxa0ANDxa0SAVE都具有R1字段。他们通过根据指令的字段形成分支地址。指令的操作概括如下:在24位寻址模式中,两个指令将返回地址放在通用寄存器R1的比特位置40-63并且保持该寄存器的位0-31不变。BRANCHxa0ANDxa0link将用于指令的指令长度代码和条件代码和来自当前PSW的程序掩码放在通用寄存器R1的比特位置32-39。BRANCHxa0ANDxa0SAVE将0放在这些比特位置。xa0●在31位寻址模式中,两个指令将返回地址放在通用寄存器R1的比特位置33-63以及将1放在通用寄存器R1的比特位置32,并且保持该寄存器的位0-31不变。xa0●在64位寻址模式中,两个指令将返回地址放在通用寄存器R1的比特位置0-63。xa0●在任何寻址模式中,两个指令在当前寻址模式的控制下生成xa0分支地址。指令将分支地址的位0-63放在PSW的比特位置64-127。在RR格式中,如果指令的R2字段是0,两个指令不执行分支。xa0可以看出,在24位和31位寻址模式中,BRANCHxa0ANDxa0SAVE将基本寻址模式位、PSW的位32放在通用寄存器R1的比特位置32。BRANCHxa0ANDxa0link在31位寻址模式这样做。当在链接的期间需要改变寻址模式时,使用指令BRANCHxa0ANDxa0SAVExa0ANDxa0SETxa0MODE和BRANCHxa0ANDxa0SETxa0MODE。这些指令具有R1和R2字段。指令的操作概括如下:xa0●BRANCHxa0ANDxa0SAVExa0ANDxa0SETxa0MODE将通用寄存器R1的内容设置为与BRANCHxa0ANDxa0SAVE相同。此外,指令将扩展寻址模式位、PSW的位31放在寄存器的比特位置63。xa0●BRANCHxa0ANDxa0SETxa0MODE,如果R1非0,执行如下。在24或31位模式,将PSW的位32放在通用寄存器R1的比特位置32,并保持寄存器的位0-31和33-63不变。注意,如果寄存器包含指令地址,寄存器的位63应该是0。在64位模式,指令将PSW的位31(1)放在通用寄存器R1的比特位置63,并保持寄存器的位0-62不变。xa0●当R2非0时,两个指令如下设置寻址模式并执行分支。通用寄存器R2的位63被放在PSW的比特位置31。如果位63是0,寄存器的位32被放在PSW的比特位置32。如果位63是1,PSW位32被设置为1。然后在新寻址模式的控制下,从寄存器的内容生成分支地址,除了寄存器的位63被视为0之外。指令将分支地址的位0-63放在PSW的比特位置64-127。通用寄存器R2的位63保持不变,并且因此在进入被调用的程序时可以是1。如果R2与R1相同,指定的通用寄存器中的结果与为R1寄存器指定的相同。xa0中断(上下文切换)xa0中断机制允许CPU改变其状态作为条件的结果,在配置之外,在配置中,或在CPU自身中。为了允许对高优先级的条件快速响应并且立即认出条件的类型,中断条件被分组成6类:外部、输入/输出、机器检查、程序、重启和管理员调用。xa0中断存在于存储当前PSW作为旧PSW,存储标识中断的原因的信息,以及取回新PSW。处理按照新PSW所指定的恢复。在中断时存储的旧PSW一般包含如果不发生中断应该接下来执行的指令的地址,因此允许恢复被中断的程序。对于程序和管理员调用中断,存储的信息还包含标识最近执行的指令长度的代码,因此允许程序响应中断的原因。在对于其的正常响应是重执行导致中断的指令的一些程序条件的情况下,指令地址直接标识最近执行的指令。xa0除了重启之外,仅当CPU处于运行状态时可发生中断。在CPU处于停止或运行状态时,重启中断可发生。xa0任何访问异常被视为与该异常相关联的指令执行的一部分。当CPU试图从不可用的位置预先取回或检测到一些其他访问异常条件时,不标识访问异常,但是分支指令或中断改变指令顺序使得指令不被执行。由于取指,每个指令可使访问异常被标识。此外,由于对存储中操作数的访问,与指令执行相关联的访问异常可发生。当没遇到异常,不能取回第一指令半字时,由于取回指令的访问异常被指明。当指令的第一半字没有访问异常时,根据指令的前2位指定的指令长度可为附加的半字指明访问异常;但是,当不访问指令的第二或第三半字可以执行操作时,是否为不用的部分指明访问异常是不可预测的。因为为取回指令指明访问异常对所有指令是共同的,它不包括在各个指令定义中。xa0除非在各个指令说明中指明,下列规则适用于与访问操作数位置相关联的异常。对于取回型操作数,仅需要为完成操作所需的那部分操作数指明访问异常。是否为完成操作不需要的取回型操作数的那些部分指明访问异常是不可预测的。xa0对于存储型操作数,即使不使用操作数的不可访问部分也能完xa0成操作,为整个操作数标识访问异常。在存储型操作数的值被定义为不可预测的情况下,是否指明访问异常是不可预测的。不论何时访问操作数位置都可导致访问异常被标识,单词“访问”被包括在指令说明中的程序异常列表中。这个词还指示哪个操作数可导致异常被标识以及是否在对该操作数位置取回或存储访问时标识异常。仅为如为每个特定指令定义的操作数的一部分标识访问异常。xa0当CPU试图执行带有无效操作码的指令时,操作异常被标识。操作码可以是未赋值的,或者带有该操作码的指令可以不安装在CPU上。操作被抑制。指令长度代码是1、2或3。操作异常被程序中断代码十六进制0001指明(或者十六进制0081如果指明同时的PER事件。)xa0一些模型可提供本公开中未说明的指令,比如那些用于提供帮助或作为特殊或定制特征的一部分。因此,本公开中未说明的操作码不一定导致操作异常被标识。而且,这些指令可导致操作模式建立或者可改变机器以便影响后续指令的执行。为了避免导致这种操作,仅当需要与操作码相关联的特定功能时,带有本公开中未说明的操作码的指令应被执行。xa0当下列中任一为真时,规范异常被标识:xa01.1被导入PSW的未赋值比特位置(即,比特位置0、2-4、24-30或33-63中的任一)。这被当作早的PSW规范异常。xa02.1被导入PSW的比特位置12。这被当作早的PSW规范异常。xa03.在下列方式中的任一中,PSW无效:a.PSW的位31是1且位32是0。b.PSW的位31和32是0,指示24位寻址模式,并且PSW的位64-103不是全0。c.PSW的位31是0且位32是1,指示31位寻址模式,并且PSW的位64-96不是全0。这被当作早的PSW规范异常。xa04.PSW包含奇数的指令地址。xa05.操作数地址没有指定需要这种完整边界指定的指令中的完整边界。xa06.奇数编号的通用寄存器由需要偶数编号的寄存器指定的指令的R字段指定。xa07.为扩展的操作数指定除0、1、4、5、8、9、12或13之外的浮点寄存器。xa08.十进制算术中的乘数或除数超过15个数字和符号。xa09.在十进制乘法或除法中第一操作数字段的长度小于或等于第二操作数字段的长度。xa010.尝试执行CIPHERxa0MESSAGE,CIPHERxa0MESSAGExa0WITHxa0CHAINING,COMPUTExa0INTERMEDIATExa0MESSAGExa0DIGEST,COMPUTExa0LASTxa0MESSAGExa0DIGEST或COMPUTExa0MESSAGExa0AUTHENTICATIONxa0CODE,通用寄存器0的位57-63中的功能码包含未赋值或未安装的功能码。xa011.尝试执行CIPHERxa0MESSAGE,CIPHERxa0MESSAGExa0WITHxa0CHAINING,并且R1或R2字段指定奇数编号的寄存器或通用寄存器0。xa012.尝试执行CIPHERxa0MESSAGE,CIPHERxa0MESSAGExa0WITHxa0CHAINING,COMPUTExa0INTERMEDIATExa0MESSAGExa0DIGEST或COMPUTExa0MESSAGExa0AUTHENTICATIONxa0CODE,并且第二操作数长度不是指定的功能的数据块大小的倍数。这个规范异常条件不适用于查询功能。xa013.尝试执行COMPARExa0ANDxa0FORMxa0CODEWORD,并且通用寄存器1、2和3最初不包含偶数值。xa032.尝试执行COMPARExa0ANDxa0SWAPxa0ANDxa0STORE,并且存在下列条件中任一:xa0●功能码指定未赋值的值。xa0●存储特征指定未赋值的值。xa0●功能码是0,并且第一操作数不指定在字边界上。xa0●功能码是1,并且第一操作数不指定在双字边界上。xa0●第二操作数不指定在对应于存储值大小的整数边界上。xa033.尝试执行COMPARExa0LOGICALxa0LONGxa0UNICODE或MOVExa0LONGxa0UNICODE,并且通用寄存器R1+1或R3+1不指定偶数个字节。xa034.尝试执行COMPARExa0LOGICALxa0STRING,MOVExa0STRING或SEARCHxa0STRING,并且通用寄存器0的位32-55不是全0。xa035.尝试执行COMPRESSIONxa0CALL,并且通用寄存器0的位48-51具有二进制值0000和0110-1111中的任何一个。xa036.尝试执行COMPUTExa0INTERMEDIATExa0MESSAGExa0DIGEST,COMPUTExa0LASTxa0MESSAGExa0DIGEST或COMPUTExa0MESSAGExa0AUTHENTICATIONxa0CODE,并且下列之一为真:xa0●R2字段指定奇数编号的寄存器或通用寄存器0。xa0●通用寄存器0的位56不是0。xa037.尝试执行CONVERTxa0HFPxa0TOxa0BFP,CONVERTxa0TOxa0FIXED(BFP或HFP)或LOADxa0FPxa0INTEGER(BFP),并且M3字段没有指定有效的变址数。xa038.尝试执行DIVIDExa0TOxa0INTEGER,并且M4字段没有指定有效的变址数。xa039.尝试执行EXECUTE,并且目标地址是奇数。xa040.尝试执行EXTRACTxa0STACKEDxa0STATE,并且通用寄存器2的比特位置56-63中的代码当未安装ASN和LX再使用设施时大于4或者当安装该设施时大于5。xa041.尝试执行FINDxa0LEFTMOSTxa0ONE,并且R1字段指定奇数编号的寄存器。xa042.尝试执行INVALIDATExa0DATxa0TABLExa0ENTRY,并且通用寄存器R2的位44-51不是全0。xa043.尝试执行LOADxa0FPC,并且对应于FPC寄存器中的无支持的位的第二操作数的一个或多个位是1。xa044.尝试执行LOADxa0PAGE-TABLE-ENTRYxa0ADDRESS,并且指令的M4字段包含除了二进制0000-0100之外的任何值。xa045.尝试执行LOADxa0PSW,并且第二操作数地址的双字的位12是0。它是模型取决于这个异常是否被标识。xa046.尝试执行MONITORxa0CALL,并且指令的比特位置8-11不包含0。xa047.尝试执行MOVExa0PAGE,并且通用寄存器0的比特位置48-51不包含0或寄存器的位52和53都是1。xa048.尝试执行PACKxa0ASCII,并且L2字段大于31。xa049.尝试执行PACKxa0UNICODE,并且L2字段大于63或是偶数。xa050.尝试执行PERFORMxa0FLOATINGxa0POINTxa0OPERATION,通用寄存器0的位32是0,并且位33-63中一个或多个字段是无效的或指定未安装的功能。xa051.尝试执行PERFORMxa0LOCKEDxa0OPERATION,并且下列中任一为真:xa0●T位、通用寄存器0的位55是0,并且寄存器的位56-63中的功能码是无效的。xa0●通用寄存器0的位32-54不是全0。xa0●在访问寄存器模式,对于导致使用包含ALET的参数列表的功能码,R3字段为0。xa052.尝试执行PERFORMxa0TIMINGxa0FACILITYxa0FUNCTION,并且下列之一为真:xa0●通用寄存器0的位56不是0。xa0●通用寄存器0的位57-63指定未赋值的或未安装的功能码。xa053.尝试执行PROGRAMxa0TRANSxa0PER或PROGRAMxa0TRANSFERxa0WITHxa0INSTANCE,并且下列全为真:xa0●PSW中扩展的寻址模式位是0。xa0●基本寻址模式位、指令的R2字段指定的通用寄存器中的位32是0。xa0●同一寄存器中指令地址的位33-39不是全0。xa054.尝试执行RESUMExa0PROGRAM,并且下列第一为真:xa0●第二操作数中PSW字段的位31、32和64-127对于放在当前PSW中不是有效的。如果下列中任一为真,异常被标识:xa0-位31和32都是0并且位64-103不是全0。-位31和32分别是0和1,并且位64-96不是全0。-位31和32分别是1和0。-位127是1。xa0●参数列表的位0-12不是全0。xa055.尝试执行SEARCHxa0STRINGxa0UNICODE,并且通用寄存器0的位32-47不是全0。xa056.尝试执行SETxa0ADDRESSxa0SPACExa0CONTROL或SETxa0ADDRESSxa0SPACExa0CONTROLxa0FAST,并且第二操作数地址的位52和53不全是0。xa057.尝试执行SETxa0ADDRESSINGxa0MODE.(SAM24),并且PSW中未更新的指令地址的位0-39、PSW的位64-103不是全0。xa058.尝试执行SETxa0ADDRESSINGxa0MODE.(SAM31),并且PSW中未更新的指令地址的位0-32、PSW的位64-96不是全0。xa059.尝试执行SETxa0CLOCKxa0PROGRAMMABLExa0FIELD,并且通用寄存器0的位32-47不是全0。xa060.尝试执行SETxa0FPC,并且对应于FPC寄存器中的无支持的位的第一操作数的一个或多个位是1。xa061.尝试执行STORExa0SYSTEMxa0INFORMATION,通用寄存器0中的功能码是有效的,并且下列之一为真:xa0●通用寄存器0的位36-55并且通用寄存器1的位32-47不是全0。xa0●第二操作数地址没有对准4K字节边界。xa062.尝试执行TRANSLATExa0TWOxa0TOxa0ONE或TRANSLATExa0TWOxa0TOxa0TWO,并且通用寄存器R1+1中的长度不指定偶数个字节。xa063.尝试执行UNPACKxa0ASCII,并且L1字段大于31。xa064.尝试执行UNPACKxa0UNICODE,并且L1字段大于63或是xa0偶数。xa065.尝试执行UPDATExa0TREE,并且通用寄存器4和5的初始内容在24位或31位寻址模式中不是8的倍数或者在64位寻址模式中不是16的倍数。由旧PSW标识的指令的执行被抑制。但是,对于早的PSW规范异常(原因1-3),导入新PSW的操作被完成,但是之后中断立即发生。优选地,指令长度代码(ILC)是1、2或3,指示导致异常的指令的长度。当指令地址是奇数时(6-33页上的原因4),ILC是否是1、2或3是不可预测的。当由于早的PSW规范异常(原因1-3)被标识,并且异常已被LOADxa0PSW,LOADxa0PSWxa0EXTENDED,PROGRAMxa0RETURN或中断导入,ILC是0。当异常被SETxa0ADDRESSINGxa0MODE(SAM24,SAM31)导入时,ILC是1,或者如果SETxa0ADDRESSINGxa0MODE是EXECUTE的目标,它是2。当异常被SETxa0SYSTEMxa0MASK或STORExa0THENxa0ORxa0SYSTEMxa0MASK导入时,ILC是2。xa0程序中断用于报告在程序执行的期间发生的异常和事件。程序中断导致旧PSW被存储在实际位置336-351且新PSW被从实际位置464-479取回。中断的原因被中断代码标识。中断代码被放在实际位置142-143,指令长度代码被放在实际位置141的字节的比特位置5和6,剩余位设置为0,并且0被存储在实际位置140。由于一些原因,标识中断的原因的附加信息存储在实际位置144-183。如果安装了PER-3设施,则作为程序中断动作的一部分,破坏事件地址(breaking-event-address)寄存器的内容被放在实际存储位置272-279。除了PER事件和加密操作异常,导致中断的条件由放在中断代码的最右边7比特位置的编码值指示。一次仅可指示一个条件。中断代码的位0-7被设置为0。通过将中断代码的位8设置为1指示PER事件。当这是唯一条件时,位0-7和9-15也设置为0。当与另一程序中断条件同时指示PER事件时,位8是1,并且为另一条件设置位0-7和9-15。加密操作异常由中断代码十六进制0119或十六进制0199指示,如果也指示PER事件。xa0当有对应的掩码位时,仅当掩码位是1时可发生程序中断。PSW中的程序掩码控制异常中的4个,FPC寄存器中的IEEE掩码控制IEEE异常,控制寄存器0中的位33控制SETxa0SYSTEMxa0MASK是否导致特殊操作异常,控制寄存器8中的位48-63控制由于监视器事件的中断,以及掩码的层次控制由于PER事件的中断。当任一控制掩码位是0时,条件被忽略;条件不保持未决。xa0当用于程序中断的新PSW具有PSW格式错误或导致异常在取指过程中被标识时,一串程序中断可发生。xa0指示为程序异常的一些条件也可被通道子系统标识,其中异常在子通道状态字或扩展状态字中指示。xa0当数据异常导致程序中断时,数据异常代码(DXC)存储在位置147,并且0存储在位置144-146。各种类型的数据异常条件之间的DXC不同。当AFP寄存器(附加浮点寄存器)控制位、控制寄存器0的位45是1时,DXC也放在浮点控制寄存器(FPC)的DXC字段中。当任何其他程序异常被报告时,FPC寄存器中的DXC字段保持不变。DXC是指示数据异常的具体原因的8位代码。xa0DXC2和3是互斥的并且比任何其他DXC的优先级高。因此,例如,DXC2(BFP指令)优先于任何IEEE异常;并且DXC3(DFP)优先于任何IEEE异常或模拟的IEEE异常。作为另一示例,如果用于DXC3(DFP指令)和DXC1的条件(AFP寄存器)都存在,DXC3被报告。当规范异常和AFP寄存器数据异常应用时,无法预测哪一个被报告。xa0当CPU尝试引用配置中不可用的主存储位置时,寻址异常被标识。当位置未被安装时,当存储单元不在配置中时,或当存储单元中断电时,主存储位置在配置中不可用。指定在配置中不可用的存储位置的地址被视为无效。当指令的地址无效时,操作被抑制。类似地,当EXECUTE的目标指令的地址无效时,操作被抑制。而且,当在访问表或表项目中遇到寻址异常时,操作的单元被抑制。规则适用的表和表项目是可分派单元控制表,主ASN第二表,以及访问xa0列表中的项目,区域第一表,区域第二表,区域第三表,段表,页表,链接表,链接第一表,链接第二表,入口表,ASN第一表,ASN第二表,授权表,链接堆栈以及跟踪表。当为了引用区域第一表,区域第二表,区域第三表,段表和页表,在对动态地址转换的隐含引用和与执行LOADxa0PAGE-TABLE-ENTRYxa0ADDRESS,LOADxa0REALxa0ADDRESS,STORExa0REALxa0ADDRESS和TESTxa0PROTECTION相关联的引用中遇到它们时,寻址异常引起抑制。类似地,当隐含地或作为LOADxa0PAGE-TABLE-ENTRYxa0ADDRESS,LOADxa0REALxa0ADDRESS,STORExa0REALxa0ADDRESS,TESTxa0ACCESS,或TESTxa0PROTECTION的一部分完成访问寄存器转换时,用于访问可分派单元控制表、主ASN第二表入口、访问列表、ASN第二表或授权表的寻址异常引起抑制。除了一些其执行被抑制的特定指令之外,对于可被转换但是指定不可用的位置的操作数地址,操作结束。为了结束,改变仅对结果字段发生。在这个上下文中,术语“结果字段”包括条件代码、寄存器和提供的以及被指定被指令改变的任何存储位置。xa0存储操作数取回引用:xa0当存储操作数的字节仅作为源参与指令执行,操作数被称为取回型操作数,并且对该位置的引用被称为存储操作数取回引用。通过指示访问异常是用于取回的,取回型操作数在各个指令定义中被标识。xa0取回型操作数的单个字节中的所有位被同时访问。当操作数由多于一个字节组成时,字节可以从存储中一次一字节逐个取回。除非被指定,字节不必按任何特殊顺序取回。xa0一个指令的存储操作数取回引用发生在那些所有前面的指令之后以及那些后续的指令之前,如其他CPU和通道程序所观察到的。任何一个指令的操作数按照针对该指令指定的顺序被取回。CPU可在指令被执行之前取回指令的操作数。对于在操作数被取回时与它xa0被使用时之间的时间长度没有定义的限制。而且,如CPU自身所观察的,它的存储操作数引用按照概念的顺序执行。xa0对于某些特殊指令,多个操作数的取回引用可以像对通过其他CPU和通过通道程序的某些访问锁定。这种取回引用被称为互锁取回引用。与互锁取回引用相关联的取回访问不必一个接一个地发生,但是其他CPU的所有存储访问可以不发生在与互锁取回引用的取回访问之间的互锁取回引用相同的位置。xa0用于LOADxa0PAIRxa0DISJOINT(加载对分离)指令的存储操作数取回引用可以看似互锁取回引用。LOADxa0PAIRxa0DISJOINT是否能借助互锁取回将两个操作数都取回由条件代码指示。xa0存储操作数存储引用:xa0当存储操作数的字节仅作为目的地而参与指令执行以被结果替换时,操作数被称为存储型操作数,以及对位置的引用称为存储操作数存储引用。通过指示访问异常是用于存储的,存储型操作数在各个指令定义中被标识。xa0存储型操作数的单个字节中的所有位被同时访问。当操作数由多于一个字节组成时,字节可以一次一字节逐个放在存储中。除非被指定,字节不必按任何特殊顺序存储。xa0CPU可延迟将结果放在存储中。对结果在被存储之前可保持未决的时间长度没有定义的限制。这个延迟不影响结果被放在存储中的顺序。xa0在所有前面的指令的结果已被放在存储中之后以及后面的指令的任何结果被存储之前,一个指令的结果被放在存储中,如其他CPU和通道程序所观察到的。任何一个指令的结果按为该指令指定的顺序被存储。xa0CPU不取回来自存储位置的操作数、ART表项或DAT表项,直到CPU以该位置为目的地的所有信息已被存储。取回的指令可以像在信息出现在存储中之前被更新。仅作为序列化操作的结果并且xa0在CPU进入停止状态之前,存储必须被完成。xa0块并发引用xa0对于一些引用,对半字、字、双字或四字中所有字节的访问被指定就像块并发,如其他CPU和通道程序所观察到的。半字、字、双字或四字在这个部分中称为块。当取回型引用被指定为像在块中同时,在包含在块中的字节被取回的时间中不允许另一CPU或通道程序对块的存储访问。当存储型引用被指定为像在块中同时,在块中的字节被存储的时间中不允许另一CPU或通道程序对块的访问,或者取回或者存储。xa0CPU序列化:xa0在下列讨论中,术语“序列化指令”是指导致一个或多个序列化功能被执行的指令。术语“序列化操作”是指指令中的操作单元或机器操作比如导致序列化功能被执行的中断。xa0与序列化操作相关联的事件的顺序如下:xa01.CPU的所有概念上以前的存储访问被完成,如其他CPU和通道程序所观察到的。这包括所有概念上以前的存储和对存储键的改变。xa02.与序列化操作相关联的正常功能被执行。在指令执行的情况下,操作数被取回,并且结果的存储完成。异常是LOADxa0PSW,LOADxa0PSWxa0EXTENDED和SETxa0PREFIX,其中在以前的存储已被完成之前操作数可以被取回,以及中断,其中中断代码和相关字段可以在序列化之前被存储。序列化指令的取回发生在指令执行之前并且可在执行以前的指令之前,但是可能不在任何以前的序列化操作完成之前。在中断的情况下,旧的PSW、中断代码和其他信息,如果有的话,被存储,并且新的PSW被取回,但是不是必须在该序列中。xa03.最后,用于概念上后续的操作的取指和操作数访问可以开始。xa0序列化功能在发生序列化功能的CPU的控制下影响存储访问xa0的顺序。它不影响在其他CPU和通道程序控制下的存储访问的顺序。xa0特定操作数序列化xa0某些指令导致特定操作数序列化为了指令的操作数被执行。如其他CPU和通道子系统所观察到的,在对指令的特定存储操作数的概念上的后续访问可发生之前,特定操作数序列化操作由完成CPU的所有概念上以前的存储访问组成。在导致特定操作数序列化的指令完成时,指令的存储完成,如其他CPU和通道程序所观察到的。xa0互锁指令执行xa0当指令执行时,特别是在多处理器系统中,其中指令可访问与其他处理器共享的资源,当指令正在执行时,程序需要互锁对其他处理器的资源可用性以防止其他处理器访问资源。否则,可能有不可预测的结果。一些架构提供指令功能性,其中资源在指令执行的关键部分的期间被互锁。受到由共享处理器扰动的资源包括存储器和多数多处理器中的存储器高速缓存。可共享的处理器的其他资源是已知的并且被对应的架构文档指定。面对不互锁资源的一些指令执行功能性是例如,存储操作数取回引用、存储操作数存储引用、块并发引用、CPU序列化和已说明的特定操作数序列化。xa0本发明提供一种架构,其中通过如下方式而对于某些指令不需要互锁:允许依赖于实现确定指令是否受到可能的资源干扰,并且设置指示符以指示指令在不可能具有已经影响指令的架构化操作的干扰资源操作的情况下被完成,或者指令暴露于干扰资源操作。因此,可以这样编写程序,使得在执行此类指令之后测试指示符,以确定结果是否被来自另一处理器的干扰影响。如果测试失败,将调用恢复例程。在一个实施方式中,指示符可以是条件代码并且测试可以是测试条件代码以及分支回到重新执行被影响的指令。xa0加载对分离设施:xa0多线程编程语言如Java需要同步数据结构和对象以保证应用线程间状态的正确性和一致性。加强这种一致性的一种典型机制是在线程间共享的数据结构或对象中嵌入锁字(lockxa0word)。线程继而可使用原子更新指令如比较和交换以同步数据结构的所有权。例如,当考虑这里的对象O时:xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="554"/>locK_id当未锁定时保持NULL(空)值。如果一个给定的线程希望读或写对象O,它必须成功地比较和交换(CAS)其thread_id到lock_id-因此要求对象的所有权。例如:xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="700"/>ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="463"/>在一些计算机机构中,使用比较和交换需要保持lock_id的基础的高速缓存行的独占的所有权。获取高速缓存行的独占的所有权可能代价很高,因为它需要其他处理器上的高速缓存行无效和/或在拥有的处理器上重取回高速缓存行。这可能具有增加竞争窗口的影响,这实际上会加剧对如果锁操作及时就不应竞争的锁的竞争。注意,对lock_id的第二存储也通常需要通过使lock_id为NULL而释放对象。这将有效地要求重新获取对lock_id的高速缓存行的独占访问。xa0因此,在使用同步读同步的数据结构的字段的情况下,当实际同步读对象的字段不需要任何形式的独占访问时,必须写lock_id高速缓存行的代价特别高。本发明提供用于原子地加载一对分离存储器位置(加载分离对指令)的新的硬件设施。xa0加载对分离操作xa0本发明给出了称为加载对分离(LPD)的新的硬件设施。这个设施用于原子地读取一对分离存储器元素。这提供了一种机制,用于保证两个元素是一致的,或者更准确地说,当它们被加载时不存在对两个分离存储器位置的干扰更新。例如:xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="700"/>ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="700"/>注意,当在对象O之外做字段a的同步加载时,lock_id将不被存储,因此高速缓存行不应需要被独占地保持。LPD设施的备选实现在强制原子性方面可以不那么严格。例如,LPD可向用户提供通过使用条件代码加载对是否一致的反馈。其他附加实现可提供条件代码设置以指示当被加载时操作数之一是否为NULL。例如:xa0ntent="drawing" img-format="jpg" inline="no" orientation="portrait" wi="700"/>加载/存储分离(加载对分离)的程序使用:xa0优选地(图9),包括一个或多个加载/存储分离(LSD)指令的程序可被执行901,当LSD指令被执行时903,其基于LSD指令操作码将尝试原子地加载或存储数据至/自存储器,并且设置条件代码指示操作是否像是原子的。如果处理器确定来自另一处理或I/O设备的干扰存储可能破坏正在从存储器加载(或存储到存储器)的数据,条件代码被设置一个值(例如cc=3)。程序将检查这个值904xa0(例如用条件指令上的分支)并且如果操作像是非原子的(cc=3)将采取行动,比如重复LSD指令预定次数(比如10次)直到成功。在这个实施方式中,预定计数值901如果不等于0xa0906将被递减并且LPD指令将被重新执行。如果多次尝试不成功,将调用特殊例程909,将使用其他互锁方法原子地执行LSD存储操作。不同的实施方式将支持加载操作或存储操作,一个或多个分离操作数被原子地访问,以及除了条件代码之外的指示符。xa0优选地,这个指令被用于在程序中取回分离存储器操作数,程序执行包括用于取回分离存储器操作数的指令的第一例程901,所述指令包括902加载对分离指令,当其被执行时903从存储器加载两个分离操作数并且设置条件代码值。在执行LPD之后优选地通过条件指令上的分支进行测试904。905响应于测试确定所述条件代码值指示(cc=3)两个分离操作数可能已加载,带有对两个分离操作数之一的干扰存储,第二例程909被执行,包括用于从存储器取回分离存储器操作数的指令。响应于所述条件代码值(cc=0)指示两个分离操作数被加载,而没有对两个分离操作数之一的干扰存储,用于使用加载的两个分离操作数的第三例程被执行,程序901继续执行。xa0在一个实施方式中,重复第二例程直到所述条件代码值(cc=0)指示两个分离操作数被加载而没有对两个分离操作数之一的干扰存储。xa0在一个实施方式中,限制值(计数值)901被设置以用于重复。响应于所述条件代码值(cc=3)指示两个分离操作数可能在具有对两个分离操作数之一的干扰存储的情况下被加载,重复第二例程直到满足以下之一:第二例程已重复由限制值指定的次数906,或者条件代码值(cc=0)指示两个分离操作数被加载而没有对两个分离操作数之一的干扰存储。xa0在一个实施方式中,加载对分离指令导致两个分离操作数加载到通用寄存器的各自的位置中。xa0加载/存储分离(加载对分离)指令xa0在一个实施方式中,加载/存储分离(LSD)指令在图10的多处理器系统的处理器中执行。参考图7,获取701加载/存储分离指令以供执行,以便将来自存储器708的数据加载到处理器的通用寄存器707,加载/存储分离指令包括操作码,执行包括基于获取的操作码执行LSD指定的操作702,操作702包括访问存储器中的一个或多个操作数。响应于确定703来自多处理器系统的另一处理器的存储事件是否可能已经在访问存储器中的一个或多个操作数的期间修改了一个或多个操作数之一,第一指示符值被设置705706,所述第一指示符值指示来自多处理器系统的另一处理器的存储事件在访问存储器中的一个或多个操作数的期间是否已修改一个或多个操作数之一。xa0在一个实施方式中,第一指示符值包括第一条件代码值或第二条件代码值中的任何一个。响应于确定703存储事件可能在所述访问的期间已修改一个或多个操作数中的存储器中的第一操作数或存储器中的第二操作数,第一条件代码值被设置705,所述第一条件代码值指示存储器中的第一操作数或存储器中的第二操作数中的任何一个可能在所述访问的期间已被修改。响应于确定703没有存储事件在所述访问的期间修改存储器中的第一操作数或存储器中的第二操作数,第二条件代码值被设置706,所述第二条件代码值指示存储器中的第一操作数和存储器中的第二操作数中在所述访问的期间都未被修改。xa0在图8的一个实施方式中,LSD指令是加载对分离(LPD)指令,其中访问存储器中的一个或多个操作数包括从存储器取回805第一操作数和第二操作数,还包括806807取回的第一操作数被存储在LPD指令指定的第一寄存器中,并且取回的第二操作数被存储在LPD指令指定的第二寄存器中。xa0在一个实施方式中,加载对分离指令包括标识第一通用寄存器xa0的第一通用寄存器字段(B1),标识第二通用寄存器的第二通用寄存器字段(B2)和标识所述第一寄存器和所述第二寄存器的第三通用寄存器字段(R1),从由第一通用寄存器字段标识的第一通用寄存器获取第一地址801,并且获取的第一地址用于取回存储器中的第一操作数。从由第二通用寄存器字段标识的第二通用寄存器获取存储器中的第二操作数的第二地址802,并且获取的第二地址用于取回存储器中的第二操作数。加载对分离操作包括在第一寄存器中存储第一操作数806,其中第一寄存器是由第三通用寄存器字段标识的通用寄存器的高阶部分并在第二寄存器中存储第二操作数807,其中第二寄存器是由第三通用寄存器字段标识的通用寄存器的低阶部分。xa0在一个实施方式中,其中获取的加载对分离指令还包括第一位移字段和第二位移字段,第一位移字段与获取的第一地址算术相加803以创建第一存储器地址用于取回存储器中的第一操作数。第二位移字段与获取的第二地址算术相加804以创建第二存储器地址用于取回存储器中的第二操作数。xa0在一个实施方式中,来自多处理系统的多个处理器的存储事件被接收,并且接收到的存储操作的数据被存储在存储器中。xa0在一个实施方式中,其中为计算机架构定义的加载对分离指令由备选计算机架构的中央处理单元执行取回和执行,加载对分离指令被解释以标识预定的软件例程用于仿真加载对分离指令的操作,并且执行加载对分离指令包括执行预定的软件例程以执行用于执行机器指令的方法的步骤。xa0参考图6,其描述了一个架构的加载对分离机器指令(LPD和LPDG)的两个示例形式。指令的48位包括操作码(位0-8:12-15),用于指定对应的第一(B1)、第二(B2)和第三(R3)通用寄存器的B1、B2和R3字段,以及位移字段D1和D2,其与对应的通用寄存器B1和B2的内容一起组合使用以确定将要被原子取回(块并发地)的两个操作数的存储器地址,这两个操作数在被取回时不存在来自另一处理器单元的干扰存储。xa0通用寄存器R3指定奇/偶寄存器对的偶数编号的寄存器(偶寄存器包含高阶位以及奇寄存器包含该对的低阶位)。xa0当指令被执行时,第一操作数未改变地被放在第三操作数的偶数编号的寄存器中,第二操作数未改变地被放在第三操作数的奇数编号的寄存器中,并且条件代码值被设置在条件代码寄存器中。条件代码值指示第一和第二操作数是否像是通过块并发互锁取回而取回的。换言之,他们看似在不存在来自任何其他处理器的任何干扰存储的情况下被原子地执行。xa0对于LPD,第一和第二操作数是存储中的32位“字”,并且第三操作数是通用寄存器R3和R3+1的位32-63;寄存器的位0-31是未改变的。对于LPDG,第一和第二操作数是存储中的64位“双字”,并且第三操作数是通用寄存器R3和R3+1的位0-63。xa0如其他CPU所观察到的,当第一和第二操作数像是通过块并发互锁取回而取回的时,设置条件代码0。当第一和第二操作数不是通过块并发互锁取回(原子操作)而取回的时,设置条件代码3。不管条件代码,第三操作数被加载。xa0第一和第二操作数的位移被当作12位无符号二进制整数。xa0LPD的第一和第二操作数必须被指定在字边界上。LPDG的第一和第二操作数必须被指定在双字边界上。通用寄存器R3必须指定偶数编号的寄存器。否则,规范异常被标识。xa0产生的条件代码:xa00借助于互锁取回而被加载的寄存器对xa01-xa02-xa03未借助于互锁取回而被加载的寄存器对xa0程序异常:xa0●访问(取回,操作数1和2)xa0●操作(如果互锁访问设施未被安装)xa0●规范xa0编程注意:xa01.条件代码的设置依赖于配置中其他CPU的存储访问。xa02.当产生的条件代码是3时,程序可以分支回到重新执行加载对分离指令。但是,在重复不成功的尝试以获取互锁取回之后,程序应使用对存储操作数的序列化访问的代替方法。建议在分支到代替路径之前,程序重执行加载对分离不超过10次。xa03.程序应该能适应从不设置条件代码0的情况。xa0参考图10,本发明的实施方式包括共享存储器1005的多个处理器(P1到Pn)1001xa01002xa01003xa01004,每个处理器1001可包括用于高速缓存存储器操作数的高速缓存,用于访问存储器中的数据的加载/存储单元,用于基于指令操作码执行指令的功能的执行单元,以及用于将虚拟(逻辑)地址转换成实际(绝对)存储器地址的动态地址转换(DAT),包括用于高速缓存DAT转换的TLB用于改进性能。处理器可以在系统总线上共享外围设备1006(DASD/带)或可具有本地外围设备。xa0上述对理解一个计算机系统实施方式的结构和术语是有用的。本发明不限于z/架构或其提供的说明。利用这里的教程,本发明可有利地应用于其他计算机制造商的其他计算机架构。xa0虽然这里已图示和说明了本发明的优选实施方式,但是应理解本发明不限于此处公开的精确的构造,并且保留在如所附权利要求定义的本发明的范围内的所有改变和修改的权利。xa0